Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kpipewire for openSUSE:Factory checked in at 2023-03-02 23:02:18 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kpipewire (Old) and /work/SRC/openSUSE:Factory/.kpipewire.new.31432 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kpipewire" Thu Mar 2 23:02:18 2023 rev:10 rq:1068261 version:5.27.2 Changes: -------- --- /work/SRC/openSUSE:Factory/kpipewire/kpipewire.changes 2023-02-24 18:07:03.469029942 +0100 +++ /work/SRC/openSUSE:Factory/.kpipewire.new.31432/kpipewire.changes 2023-03-02 23:02:34.330911588 +0100 @@ -1,0 +2,13 @@ +Tue Feb 28 17:34:15 UTC 2023 - Fabian Vogt <[email protected]> + +- Update to 5.27.2 + * New bugfix release + * For more details please see: + * https://kde.org/announcements/plasma/5/5.27.2 +- Changes since 5.27.1: + * PipewireSourceItem: Expose stream state + * Finish the recording when the last frame has arrived + * Export logging categories where they belong + * sourcestream: Allocate the buffer outside together with the pods + +------------------------------------------------------------------- Old: ---- kpipewire-5.27.1.tar.xz kpipewire-5.27.1.tar.xz.sig New: ---- kpipewire-5.27.2.tar.xz kpipewire-5.27.2.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kpipewire.spec ++++++ --- /var/tmp/diff_new_pack.sZ2G0L/_old 2023-03-02 23:02:34.890914124 +0100 +++ /var/tmp/diff_new_pack.sZ2G0L/_new 2023-03-02 23:02:34.894914142 +0100 @@ -21,7 +21,7 @@ %{!?_plasma5_bugfix: %global _plasma5_bugfix %{version}} %bcond_without released Name: kpipewire -Version: 5.27.1 +Version: 5.27.2 Release: 0 Summary: PipeWire integration for KDE Plasma License: LGPL-2.0-only AND LGPL-3.0-only ++++++ kpipewire-5.27.1.tar.xz -> kpipewire-5.27.2.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-5.27.1/CMakeLists.txt new/kpipewire-5.27.2/CMakeLists.txt --- old/kpipewire-5.27.1/CMakeLists.txt 2023-02-21 12:36:51.000000000 +0100 +++ new/kpipewire-5.27.2/CMakeLists.txt 2023-02-28 13:18:22.000000000 +0100 @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) project(KPipewire) -set(PROJECT_VERSION "5.27.1") +set(PROJECT_VERSION "5.27.2") set(PROJECT_VERSION_MAJOR 5) set(KF5_MIN_VERSION "5.102.0") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-5.27.1/po/zh_CN/kpipewire5.po new/kpipewire-5.27.2/po/zh_CN/kpipewire5.po --- old/kpipewire-5.27.1/po/zh_CN/kpipewire5.po 2023-02-21 12:36:51.000000000 +0100 +++ new/kpipewire-5.27.2/po/zh_CN/kpipewire5.po 2023-02-28 13:18:22.000000000 +0100 @@ -3,7 +3,7 @@ "Project-Id-Version: kdeorg\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2022-05-31 00:52+0000\n" -"PO-Revision-Date: 2023-02-15 11:08\n" +"PO-Revision-Date: 2023-02-24 12:59\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-5.27.1/src/CMakeLists.txt new/kpipewire-5.27.2/src/CMakeLists.txt --- old/kpipewire-5.27.1/src/CMakeLists.txt 2023-02-21 12:36:51.000000000 +0100 +++ new/kpipewire-5.27.2/src/CMakeLists.txt 2023-02-28 13:18:22.000000000 +0100 @@ -32,7 +32,7 @@ ) ecm_qt_install_logging_categories( - EXPORT KPipeWire + EXPORT KPipeWireRecord FILE kpipewirerecord.categories DESTINATION "${KDE_INSTALL_LOGGINGCATEGORIESDIR}" ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-5.27.1/src/pipewirerecord.cpp new/kpipewire-5.27.2/src/pipewirerecord.cpp --- old/kpipewire-5.27.1/src/pipewirerecord.cpp 2023-02-21 12:36:51.000000000 +0100 +++ new/kpipewire-5.27.2/src/pipewirerecord.cpp 2023-02-28 13:18:22.000000000 +0100 @@ -167,11 +167,11 @@ return; } connect(m_stream.get(), &PipeWireSourceStream::streamParametersChanged, this, &PipeWireRecordProduce::setupStream); + connect(m_stream.get(), &PipeWireSourceStream::stateChanged, this, &PipeWireRecordProduce::stateChanged); } -PipeWireRecordProduce::~PipeWireRecordProduce() noexcept +PipeWireRecordProduce::~PipeWireRecordProduce() { - finish(); } void PipeWireRecordProduceThread::run() @@ -190,13 +190,17 @@ void PipeWireRecordProduceThread::deactivate() { + m_producer->m_deactivated = true; if (m_producer) { m_producer->m_stream->setActive(false); } } -void PipeWireRecordProduce::finish() +void PipeWireRecordProduce::stateChanged(pw_stream_state state) { + if (state != PW_STREAM_STATE_PAUSED || !m_deactivated) { + return; + } if (!m_stream) { qCDebug(PIPEWIRERECORD_LOGGING) << "finished without a stream"; return; @@ -216,6 +220,7 @@ av_free(m_avCodecContext); avformat_free_context(m_avFormatContext); } + QThread::currentThread()->quit(); } QString PipeWireRecord::extension() @@ -355,7 +360,6 @@ d->m_recordThread->start(); } else if (d->m_recordThread) { d->m_recordThread->deactivate(); - d->m_recordThread->quit(); connect(d->m_recordThread.get(), &PipeWireRecordProduceThread::finished, this, [this] { qCDebug(PIPEWIRERECORD_LOGGING) << "produce thread finished" << d->m_output; @@ -364,7 +368,6 @@ Q_EMIT stateChanged(); }); d->m_produceThreadFinished = false; - d->m_recordThread.release(); } Q_EMIT stateChanged(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-5.27.1/src/pipewirerecord_p.h new/kpipewire-5.27.2/src/pipewirerecord_p.h --- old/kpipewire-5.27.1/src/pipewirerecord_p.h 2023-02-21 12:36:51.000000000 +0100 +++ new/kpipewire-5.27.2/src/pipewirerecord_p.h 2023-02-28 13:18:22.000000000 +0100 @@ -56,7 +56,6 @@ PipeWireRecordProduce(const QByteArray &encoder, uint nodeId, uint fd, const QString &output); ~PipeWireRecordProduce() override; - void finish(); QString error() const { return m_error; @@ -68,6 +67,7 @@ void processFrame(const PipeWireFrame &frame); void updateTextureImage(const QImage &image, const PipeWireFrame &frame); void render(const PipeWireFrame &frame); + void stateChanged(pw_stream_state state); AVCodecContext *m_avCodecContext = nullptr; const AVCodec *m_codec = nullptr; @@ -93,6 +93,7 @@ DmaBufHandler m_dmabufHandler; uint m_lastKeyFrame = 0; int64_t m_lastPts = -1; + QAtomicInt m_deactivated = false; }; class PipeWireRecordProduceThread : public QThread diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-5.27.1/src/pipewiresourceitem.cpp new/kpipewire-5.27.2/src/pipewiresourceitem.cpp --- old/kpipewire-5.27.1/src/pipewiresourceitem.cpp 2023-02-21 12:36:51.000000000 +0100 +++ new/kpipewire-5.27.2/src/pipewiresourceitem.cpp 2023-02-28 13:18:22.000000000 +0100 @@ -177,7 +177,9 @@ d->m_stream->setActive(isVisible() && isComponentComplete()); connect(d->m_stream.data(), &PipeWireSourceStream::frameReceived, this, &PipeWireSourceItem::processFrame); + connect(d->m_stream.data(), &PipeWireSourceStream::stateChanged, this, &PipeWireSourceItem::stateChanged); } + Q_EMIT stateChanged(); } void PipeWireSourceItem::setNodeId(uint nodeId) @@ -410,6 +412,27 @@ } } +PipeWireSourceItem::StreamState PipeWireSourceItem::state() const +{ + if (!d->m_stream) { + return StreamState::Unconnected; + } + switch (d->m_stream->state()) { + case PW_STREAM_STATE_ERROR: + return StreamState::Error; + case PW_STREAM_STATE_UNCONNECTED: + return StreamState::Unconnected; + case PW_STREAM_STATE_CONNECTING: + return StreamState::Connecting; + case PW_STREAM_STATE_PAUSED: + return StreamState::Paused; + case PW_STREAM_STATE_STREAMING: + return StreamState::Streaming; + default: + return StreamState::Error; + } +} + uint PipeWireSourceItem::fd() const { return d->m_fd.value_or(0); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-5.27.1/src/pipewiresourceitem.h new/kpipewire-5.27.2/src/pipewiresourceitem.h --- old/kpipewire-5.27.1/src/pipewiresourceitem.h 2023-02-21 12:36:51.000000000 +0100 +++ new/kpipewire-5.27.2/src/pipewiresourceitem.h 2023-02-28 13:18:22.000000000 +0100 @@ -31,6 +31,10 @@ class KPIPEWIRE_EXPORT PipeWireSourceItem : public QQuickItem { Q_OBJECT + + /// Returns where the streams current state + Q_PROPERTY(StreamState state READ state NOTIFY stateChanged) + /// Specify the pipewire node id that we want to play Q_PROPERTY(uint nodeId READ nodeId WRITE setNodeId NOTIFY nodeIdChanged) @@ -41,6 +45,9 @@ */ Q_PROPERTY(uint fd READ fd WRITE setFd NOTIFY fdChanged RESET resetFd) public: + enum class StreamState { Error, Unconnected, Connecting, Paused, Streaming }; + Q_ENUM(StreamState); + PipeWireSourceItem(QQuickItem *parent = nullptr); ~PipeWireSourceItem() override; @@ -57,9 +64,12 @@ void componentComplete() override; void releaseResources() override; + StreamState state() const; + Q_SIGNALS: void nodeIdChanged(uint nodeId); void fdChanged(uint fd); + void stateChanged(); private: void itemChange(ItemChange change, const ItemChangeData &data) override; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-5.27.1/src/pipewiresourcestream.cpp new/kpipewire-5.27.2/src/pipewiresourcestream.cpp --- old/kpipewire-5.27.1/src/pipewiresourcestream.cpp 2023-02-21 12:36:51.000000000 +0100 +++ new/kpipewire-5.27.2/src/pipewiresourcestream.cpp 2023-02-28 13:18:22.000000000 +0100 @@ -57,6 +57,7 @@ std::optional<std::chrono::nanoseconds> m_currentPresentationTimestamp; QAtomicInt m_stopped = false; + pw_stream_state m_state = PW_STREAM_STATE_UNCONNECTED; spa_video_info_raw videoFormat; QString m_error; @@ -174,6 +175,8 @@ { PipeWireSourceStream *pw = static_cast<PipeWireSourceStream *>(data); qCDebug(PIPEWIRE_LOGGING) << "state changed" << pw_stream_state_as_string(old) << "->" << pw_stream_state_as_string(state) << error_message; + pw->d->m_state = state; + Q_EMIT pw->stateChanged(state, old); switch (state) { case PW_STREAM_STATE_ERROR: @@ -198,7 +201,9 @@ void PipeWireSourceStream::onRenegotiate(void *data, uint64_t) { PipeWireSourceStream *pw = static_cast<PipeWireSourceStream *>(data); - QVector<const spa_pod *> params = pw->createFormatsParams(); + uint8_t buffer[4096]; + spa_pod_builder podBuilder = SPA_POD_BUILDER_INIT(buffer, sizeof(buffer)); + auto params = pw->createFormatsParams(podBuilder); pw_stream_update_params(pw->d->pwStream, params.data(), params.size()); } @@ -328,6 +333,11 @@ return QSize(d->videoFormat.size.width, d->videoFormat.size.height); } +pw_stream_state PipeWireSourceStream::state() const +{ + return d->m_state; +} + std::optional< std::chrono::nanoseconds > PipeWireSourceStream::currentPresentationTimestamp() const { return d->m_currentPresentationTimestamp; @@ -375,11 +385,9 @@ return d->pwNodeId; } -QVector<const spa_pod *> PipeWireSourceStream::createFormatsParams() +QVector<const spa_pod *> PipeWireSourceStream::createFormatsParams(spa_pod_builder podBuilder) { const auto pwServerVersion = d->pwCore->serverVersion(); - uint8_t buffer[4096]; - spa_pod_builder podBuilder = SPA_POD_BUILDER_INIT(buffer, sizeof(buffer)); const QVector<spa_video_format> formats = {SPA_VIDEO_FORMAT_RGBx, SPA_VIDEO_FORMAT_RGBA, SPA_VIDEO_FORMAT_BGRx, SPA_VIDEO_FORMAT_BGRA, SPA_VIDEO_FORMAT_RGB, SPA_VIDEO_FORMAT_BGR}; QVector<const spa_pod *> params; @@ -426,7 +434,9 @@ d->m_renegotiateEvent = pw_loop_add_event(d->pwCore->loop(), onRenegotiate, this); - QVector<const spa_pod *> params = createFormatsParams(); + uint8_t buffer[4096]; + spa_pod_builder podBuilder = SPA_POD_BUILDER_INIT(buffer, sizeof(buffer)); + auto params = createFormatsParams(podBuilder); pw_stream_flags s = (pw_stream_flags)(PW_STREAM_FLAG_DONT_RECONNECT | PW_STREAM_FLAG_AUTOCONNECT); if (pw_stream_connect(d->pwStream, PW_DIRECTION_INPUT, d->pwNodeId, s, params.data(), params.size()) != 0) { qCWarning(PIPEWIRE_LOGGING) << "Could not connect to stream"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-5.27.1/src/pipewiresourcestream.h new/kpipewire-5.27.2/src/pipewiresourcestream.h --- old/kpipewire-5.27.1/src/pipewiresourcestream.h 2023-02-21 12:36:51.000000000 +0100 +++ new/kpipewire-5.27.2/src/pipewiresourcestream.h 2023-02-28 13:18:22.000000000 +0100 @@ -82,6 +82,7 @@ QString error() const; QSize size() const; + pw_stream_state state() const; bool createStream(uint nodeid, int fd); void setActive(bool active); void setDamageEnabled(bool withDamage); @@ -100,12 +101,13 @@ void stopStreaming(); void streamParametersChanged(); void frameReceived(const PipeWireFrame &frame); + void stateChanged(pw_stream_state state, pw_stream_state oldState); private: static void onStreamParamChanged(void *data, uint32_t id, const struct spa_pod *format); static void onStreamStateChanged(void *data, pw_stream_state old, pw_stream_state state, const char *error_message); static void onRenegotiate(void *data, uint64_t); - QVector<const spa_pod *> createFormatsParams(); + QVector<const spa_pod *> createFormatsParams(spa_pod_builder podBuilder); void coreFailed(const QString &errorMessage); QScopedPointer<PipeWireSourceStreamPrivate> d;
