Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kpipewire6 for openSUSE:Factory checked in at 2024-10-16 23:40:43 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kpipewire6 (Old) and /work/SRC/openSUSE:Factory/.kpipewire6.new.19354 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kpipewire6" Wed Oct 16 23:40:43 2024 rev:14 rq:1208314 version:6.2.1 Changes: -------- --- /work/SRC/openSUSE:Factory/kpipewire6/kpipewire6.changes 2024-10-07 21:47:44.895059264 +0200 +++ /work/SRC/openSUSE:Factory/.kpipewire6.new.19354/kpipewire6.changes 2024-10-16 23:41:28.807787886 +0200 @@ -1,0 +2,11 @@ +Tue Oct 15 16:53:25 UTC 2024 - Fabian Vogt <fab...@ritter-vogt.de> + +- Update to 6.2.1: + * New bugfix release + * For more details see https://kde.org/announcements/plasma/6/6.2.1 +- Changes since 6.2.0: + * PipeWireSourceStream: work around crashes for pipewire < 0.3.49 (kde#492400) + * produce: Flush remaining frames when we are deactivating (kde#471159) + * update version for new release + +------------------------------------------------------------------- Old: ---- kpipewire-6.2.0.tar.xz kpipewire-6.2.0.tar.xz.sig New: ---- kpipewire-6.2.1.tar.xz kpipewire-6.2.1.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kpipewire6.spec ++++++ --- /var/tmp/diff_new_pack.TBbl08/_old 2024-10-16 23:41:30.303850286 +0200 +++ /var/tmp/diff_new_pack.TBbl08/_new 2024-10-16 23:41:30.303850286 +0200 @@ -27,14 +27,14 @@ %{!?_plasma6_version: %define _plasma6_version %(echo %{_plasma6_bugfix} | awk -F. '{print $1"."$2}')} %bcond_without released Name: kpipewire6 -Version: 6.2.0 +Version: 6.2.1 Release: 0 Summary: PipeWire integration for KDE Plasma License: LGPL-2.0-only AND LGPL-3.0-only URL: https://www.kde.org -Source: %{rname}-%{version}.tar.xz +Source: https://download.kde.org/stable/plasma/%{version}/%{rname}-%{version}.tar.xz %if %{with released} -Source1: %{rname}-%{version}.tar.xz.sig +Source1: https://download.kde.org/stable/plasma/%{version}/%{rname}-%{version}.tar.xz.sig Source2: plasma.keyring %endif BuildRequires: kf6-extra-cmake-modules ++++++ kpipewire-6.2.0.tar.xz -> kpipewire-6.2.1.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-6.2.0/CMakeLists.txt new/kpipewire-6.2.1/CMakeLists.txt --- old/kpipewire-6.2.0/CMakeLists.txt 2024-10-03 14:37:02.000000000 +0200 +++ new/kpipewire-6.2.1/CMakeLists.txt 2024-10-15 15:13:37.000000000 +0200 @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.16) -project(KPipewire VERSION "6.2.0") +project(KPipewire VERSION "6.2.1") set(KF6_MIN_VERSION "6.5.0") find_package(ECM ${KF6_MIN_VERSION} REQUIRED NO_MODULE) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-6.2.0/po/zh_CN/kpipewire6.po new/kpipewire-6.2.1/po/zh_CN/kpipewire6.po --- old/kpipewire-6.2.0/po/zh_CN/kpipewire6.po 2024-10-03 14:37:02.000000000 +0200 +++ new/kpipewire-6.2.1/po/zh_CN/kpipewire6.po 2024-10-15 15:13:37.000000000 +0200 @@ -14,8 +14,8 @@ "X-Crowdin-Project: kdeorg\n" "X-Crowdin-Project-ID: 269464\n" "X-Crowdin-Language: zh-CN\n" -"X-Crowdin-File: /kf6-trunk/messages/kpipewire/kpipewire6.pot\n" -"X-Crowdin-File-ID: 44497\n" +"X-Crowdin-File: /kf6-stable/messages/kpipewire/kpipewire6.pot\n" +"X-Crowdin-File-ID: 51424\n" #: pipewirecore.cpp:98 #, kde-format diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-6.2.0/src/pipewireproduce.cpp new/kpipewire-6.2.1/src/pipewireproduce.cpp --- old/kpipewire-6.2.0/src/pipewireproduce.cpp 2024-10-03 14:37:02.000000000 +0200 +++ new/kpipewire-6.2.1/src/pipewireproduce.cpp 2024-10-15 15:13:37.000000000 +0200 @@ -145,6 +145,11 @@ auto received = m_encoder->receivePacket(); m_pendingEncodeFrames -= received; + + // Notify the produce thread that the count of processed frames has + // changed and it can do cleanup if needed, making sure that that + // handling is done on the right thread. + QMetaObject::invokeMethod(this, &PipeWireProduce::handleEncodedFramesChanged, Qt::QueuedConnection); } }); pthread_setname_np(m_outputThread.native_handle(), "PipeWireProduce::output"); @@ -174,6 +179,10 @@ // created it in. Q_ASSERT_X(QThread::currentThread() == thread(), "PipeWireProduce", "destroy() called from a different thread than PipeWireProduce's thread"); + if (!m_stream) { + return; + } + if (m_passthroughThread.joinable()) { m_passthroughRunning = false; m_passthroughCondition.notify_all(); @@ -261,12 +270,42 @@ disconnect(m_stream.data(), &PipeWireSourceStream::frameReceived, this, &PipeWireProduce::processFrame); - m_encoder->finish(); + if (m_pendingFilterFrames <= 0 && m_pendingEncodeFrames <= 0) { + // If we have nothing pending, cleanup immediately. + m_encoder->finish(); + + // We want to clean up the source stream while in the input thread, but we + // need to do so while not handling any PipeWire callback as that risks + // crashing because we're stil executing PipeWire handling code. + QMetaObject::invokeMethod(this, &PipeWireProduce::destroy, Qt::QueuedConnection); + } else { + // If we have pending frames, wait with cleanup until all frames have been processed. + qCDebug(PIPEWIRERECORD_LOGGING) << "Waiting for frame queues to empty, still pending filter" << m_pendingFilterFrames << "encode" + << m_pendingEncodeFrames; + m_passthroughCondition.notify_all(); + } +} + +void PipeWireProduce::handleEncodedFramesChanged() +{ + if (!m_deactivated) { + return; + } - // We want to clean up the source stream while in the input thread, but we - // need to do so while not handling any PipeWire callback as that risks - // crashing because we're stil executing PipeWire handling code. - QMetaObject::invokeMethod(this, &PipeWireProduce::destroy, Qt::QueuedConnection); + // If we're deactivating but still have frames in the queue, we want to + // flush everything. Since at that point we are not receiving new frames, we + // need a different trigger to make the filtering thread process frames. + // Triggering here means the filter thread runs as fast as the encode thread + // can process the frames. + m_passthroughCondition.notify_all(); + + if (m_pendingFilterFrames <= 0) { + m_encoder->finish(); + + if (m_pendingEncodeFrames <= 0) { + destroy(); + } + } } std::unique_ptr<Encoder> PipeWireProduce::makeEncoder() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-6.2.0/src/pipewireproduce_p.h new/kpipewire-6.2.1/src/pipewireproduce_p.h --- old/kpipewire-6.2.0/src/pipewireproduce_p.h 2024-10-03 14:37:02.000000000 +0200 +++ new/kpipewire-6.2.1/src/pipewireproduce_p.h 2024-10-15 15:13:37.000000000 +0200 @@ -97,6 +97,8 @@ void setEncodingPreference(const PipeWireBaseEncodedStream::EncodingPreference &encodingPreference); + void handleEncodedFramesChanged(); + const uint m_nodeId; QScopedPointer<PipeWireSourceStream> m_stream; QString m_error; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-6.2.0/src/pipewirerecord.cpp new/kpipewire-6.2.1/src/pipewirerecord.cpp --- old/kpipewire-6.2.0/src/pipewirerecord.cpp 2024-10-03 14:37:02.000000000 +0200 +++ new/kpipewire-6.2.1/src/pipewirerecord.cpp 2024-10-15 15:13:37.000000000 +0200 @@ -192,11 +192,6 @@ void PipeWireRecordProduce::cleanup() { - if (m_encoder) { - // Clear the queue of encoded packets. - m_encoder->receivePacket(); - } - if (m_avFormatContext) { if (auto result = av_write_trailer(m_avFormatContext); result < 0) { qCWarning(PIPEWIRERECORD_LOGGING) << "Could not write trailer"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-6.2.0/src/pipewiresourcestream.cpp new/kpipewire-6.2.1/src/pipewiresourcestream.cpp --- old/kpipewire-6.2.0/src/pipewiresourcestream.cpp 2024-10-03 14:37:02.000000000 +0200 +++ new/kpipewire-6.2.1/src/pipewiresourcestream.cpp 2024-10-15 15:13:37.000000000 +0200 @@ -515,6 +515,9 @@ params += buildFormat(&podBuilder, it.key(), {}, withDontFixate, d->maxFramerate); } + + // BUG 492400: Workaround for pipewire < 0.3.49 https://github.com/PipeWire/pipewire/commit/8646117374df6fa3b73f63f9b35cda78a6aaa2f4 + params.removeAll(nullptr); return params; }