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-04-18 22:11:18 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kpipewire6 (Old) and /work/SRC/openSUSE:Factory/.kpipewire6.new.26366 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kpipewire6" Thu Apr 18 22:11:18 2024 rev:4 rq:1168737 version:6.0.4 Changes: -------- --- /work/SRC/openSUSE:Factory/kpipewire6/kpipewire6.changes 2024-03-28 14:13:42.528163338 +0100 +++ /work/SRC/openSUSE:Factory/.kpipewire6.new.26366/kpipewire6.changes 2024-04-18 22:12:10.808542050 +0200 @@ -1,0 +2,20 @@ +Wed Apr 17 08:12:31 UTC 2024 - Fabian Vogt <fab...@ritter-vogt.de> + +- Update to 6.0.4: + * New bugfix release + * For more details see https://kde.org/announcements/plasma/6/6.0.4 +- Changes since 6.0.3: + * fix version + * update version for new release + * encode: Only increase filtered frame count if frame was actually submitted + * Fix nullptr check (kde#484620) + * Generate presentation timestamps from std::chrono::steady_clock if SPA_META_Header is missing + * Fix a minor coding style issue + * Ignore buffers with SPA_META_HEADER_FLAG_CORRUPTED + * Ignore chunk size of SPA_DATA_DmaBuf + * typo + * update version for new release + * fix typo + * update version for new release + +------------------------------------------------------------------- Old: ---- kpipewire-6.0.3.tar.xz kpipewire-6.0.3.tar.xz.sig New: ---- kpipewire-6.0.4.tar.xz kpipewire-6.0.4.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kpipewire6.spec ++++++ --- /var/tmp/diff_new_pack.6jKhVX/_old 2024-04-18 22:12:12.348598647 +0200 +++ /var/tmp/diff_new_pack.6jKhVX/_new 2024-04-18 22:12:12.348598647 +0200 @@ -27,7 +27,7 @@ %{!?_plasma6_version: %define _plasma6_version %(echo %{_plasma6_bugfix} | awk -F. '{print $1"."$2}')} %bcond_without released Name: kpipewire6 -Version: 6.0.3 +Version: 6.0.4 Release: 0 Summary: PipeWire integration for KDE Plasma License: LGPL-2.0-only AND LGPL-3.0-only ++++++ kpipewire-6.0.3.tar.xz -> kpipewire-6.0.4.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-6.0.3/CMakeLists.txt new/kpipewire-6.0.4/CMakeLists.txt --- old/kpipewire-6.0.3/CMakeLists.txt 2024-03-26 16:19:14.000000000 +0100 +++ new/kpipewire-6.0.4/CMakeLists.txt 2024-04-16 12:35:41.000000000 +0200 @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.16) -project(KPipewire VERSION "6.0.3") +project(KPipewire VERSION "6.0.4") set(KF6_MIN_VERSION "6.0.0") find_package(ECM ${KF6_MIN_VERSION} REQUIRED NO_MODULE) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-6.0.3/po/zh_CN/kpipewire6.po new/kpipewire-6.0.4/po/zh_CN/kpipewire6.po --- old/kpipewire-6.0.3/po/zh_CN/kpipewire6.po 2024-03-26 16:19:14.000000000 +0100 +++ new/kpipewire-6.0.4/po/zh_CN/kpipewire6.po 2024-04-16 12:35:41.000000000 +0200 @@ -3,7 +3,7 @@ "Project-Id-Version: kdeorg\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2023-09-25 01:41+0000\n" -"PO-Revision-Date: 2024-01-06 03:31\n" +"PO-Revision-Date: 2024-03-30 19:38\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" @@ -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.0.3/src/encoder.cpp new/kpipewire-6.0.4/src/encoder.cpp --- old/kpipewire-6.0.3/src/encoder.cpp 2024-03-26 16:19:14.000000000 +0100 +++ new/kpipewire-6.0.4/src/encoder.cpp 2024-04-16 12:35:41.000000000 +0200 @@ -181,7 +181,7 @@ { } -void SoftwareEncoder::filterFrame(const PipeWireFrame &frame) +bool SoftwareEncoder::filterFrame(const PipeWireFrame &frame) { auto size = m_produce->m_stream->size(); @@ -190,12 +190,12 @@ image = QImage(m_produce->m_stream->size(), QImage::Format_RGBA8888_Premultiplied); if (!m_dmaBufHandler.downloadFrame(image, frame)) { m_produce->m_stream->renegotiateModifierFailed(frame.format, frame.dmabuf->modifier); - return; + return false; } } else if (frame.image) { image = frame.image.value(); } else { - return; + return false; } AVFrame *avFrame = av_frame_alloc(); @@ -223,6 +223,8 @@ if (auto result = av_buffersrc_add_frame(m_inputFilter, avFrame); result < 0) { qCWarning(PIPEWIRERECORD_LOGGING) << "Failed to submit frame for filtering"; } + + return true; } bool SoftwareEncoder::createFilterGraph(const QSize &size) @@ -312,17 +314,17 @@ } } -void HardwareEncoder::filterFrame(const PipeWireFrame &frame) +bool HardwareEncoder::filterFrame(const PipeWireFrame &frame) { if (!frame.dmabuf) { - return; + return false; } auto attribs = frame.dmabuf.value(); if (!m_supportsHardwareModifiers && attribs.modifier != 0) { m_produce->m_stream->renegotiateModifierFailed(frame.format, attribs.modifier); - return; + return false; } auto drmFrame = av_frame_alloc(); @@ -360,10 +362,11 @@ if (auto result = av_buffersrc_add_frame(m_inputFilter, drmFrame); result < 0) { qCDebug(PIPEWIRERECORD_LOGGING) << "Failed sending frame for encoding" << av_err2str(result); av_frame_unref(drmFrame); - return; + return false; } av_frame_free(&drmFrame); + return true; } QByteArray HardwareEncoder::checkVaapi(const QSize &size) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-6.0.3/src/encoder_p.h new/kpipewire-6.0.4/src/encoder_p.h --- old/kpipewire-6.0.3/src/encoder_p.h 2024-03-26 16:19:14.000000000 +0100 +++ new/kpipewire-6.0.4/src/encoder_p.h 2024-04-16 12:35:41.000000000 +0200 @@ -58,7 +58,7 @@ * * @note This method will be called on its own thread. */ - virtual void filterFrame(const PipeWireFrame &frame) = 0; + virtual bool filterFrame(const PipeWireFrame &frame) = 0; /** * Get the next finished frames from the libav filter chain and queue them for encoding. * @@ -118,7 +118,7 @@ public: SoftwareEncoder(PipeWireProduce *produce); - void filterFrame(const PipeWireFrame &frame) override; + bool filterFrame(const PipeWireFrame &frame) override; protected: /** @@ -140,7 +140,7 @@ HardwareEncoder(PipeWireProduce *produce); ~HardwareEncoder() override; - void filterFrame(const PipeWireFrame &frame) override; + bool filterFrame(const PipeWireFrame &frame) override; protected: /** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-6.0.3/src/pipewireproduce.cpp new/kpipewire-6.0.4/src/pipewireproduce.cpp --- old/kpipewire-6.0.3/src/pipewireproduce.cpp 2024-03-26 16:19:14.000000000 +0100 +++ new/kpipewire-6.0.4/src/pipewireproduce.cpp 2024-04-16 12:35:41.000000000 +0200 @@ -167,12 +167,14 @@ return; } + aboutToEncode(f); + if (!m_encoder->filterFrame(f)) { + return; + } + m_pendingFilterFrames++; m_previousPts = pts; - aboutToEncode(f); - m_encoder->filterFrame(f); - m_frameReceivedCondition.notify_all(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-6.0.3/src/pipewirerecord.cpp new/kpipewire-6.0.4/src/pipewirerecord.cpp --- old/kpipewire-6.0.3/src/pipewirerecord.cpp 2024-03-26 16:19:14.000000000 +0100 +++ new/kpipewire-6.0.4/src/pipewirerecord.cpp 2024-04-16 12:35:41.000000000 +0200 @@ -194,7 +194,7 @@ void PipeWireRecordProduce::cleanup() { - if (!m_encoder) { + if (m_encoder) { // Clear the queue of encoded packets. m_encoder->receivePacket(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kpipewire-6.0.3/src/pipewiresourcestream.cpp new/kpipewire-6.0.4/src/pipewiresourcestream.cpp --- old/kpipewire-6.0.3/src/pipewiresourcestream.cpp 2024-03-26 16:19:14.000000000 +0100 +++ new/kpipewire-6.0.4/src/pipewiresourcestream.cpp 2024-04-16 12:35:41.000000000 +0200 @@ -467,15 +467,18 @@ PipeWireFrame frame; frame.format = d->videoFormat.format; - struct spa_meta_header *h = (struct spa_meta_header *)spa_buffer_find_meta_data(spaBuffer, SPA_META_Header, sizeof(*h)); - if (h) { - d->m_currentPresentationTimestamp = std::chrono::nanoseconds(h->pts); - frame.presentationTimestamp = std::chrono::nanoseconds(h->pts); - frame.sequential = h->seq; + struct spa_meta_header *header = (struct spa_meta_header *)spa_buffer_find_meta_data(spaBuffer, SPA_META_Header, sizeof(*header)); + if (header) { + if (header->flags & SPA_META_HEADER_FLAG_CORRUPTED) { + qCDebug(PIPEWIRE_LOGGING) << "buffer is corrupt"; + return; + } + + d->m_currentPresentationTimestamp = std::chrono::nanoseconds(header->pts); + frame.presentationTimestamp = std::chrono::nanoseconds(header->pts); + frame.sequential = header->seq; } else { - using namespace std::chrono; - auto now = system_clock::now(); - d->m_currentPresentationTimestamp = time_point_cast<nanoseconds>(now).time_since_epoch(); + d->m_currentPresentationTimestamp = std::chrono::steady_clock::now().time_since_epoch(); frame.presentationTimestamp = d->m_currentPresentationTimestamp; } @@ -506,22 +509,29 @@ } } - if (spaBuffer->datas->chunk->size == 0 || spaBuffer->datas->chunk->flags == SPA_CHUNK_FLAG_CORRUPTED) { + if (spaBuffer->datas->chunk->flags == SPA_CHUNK_FLAG_CORRUPTED) { // do not get a frame qCDebug(PIPEWIRE_LOGGING) << "skipping empty buffer" << spaBuffer->datas->chunk->size << spaBuffer->datas->chunk->flags; } else if (spaBuffer->datas->type == SPA_DATA_MemFd) { - uint8_t *map = - static_cast<uint8_t *>(mmap(nullptr, spaBuffer->datas->maxsize + spaBuffer->datas->mapoffset, PROT_READ, MAP_PRIVATE, spaBuffer->datas->fd, 0)); + if (spaBuffer->datas->chunk->size == 0) { + qCDebug(PIPEWIRE_LOGGING) << "skipping empty memfd buffer"; + } else { + uint8_t *map = + static_cast<uint8_t *>(mmap(nullptr, spaBuffer->datas->maxsize + spaBuffer->datas->mapoffset, PROT_READ, MAP_PRIVATE, spaBuffer->datas->fd, 0)); + + if (map == MAP_FAILED) { + qCWarning(PIPEWIRE_LOGGING) << "Failed to mmap the memory: " << strerror(errno); + return; + } + QImage img = PWHelpers::SpaBufferToQImage(map, + d->videoFormat.size.width, + d->videoFormat.size.height, + spaBuffer->datas->chunk->stride, + d->videoFormat.format); + frame.image = img.copy(); - if (map == MAP_FAILED) { - qCWarning(PIPEWIRE_LOGGING) << "Failed to mmap the memory: " << strerror(errno); - return; + munmap(map, spaBuffer->datas->maxsize + spaBuffer->datas->mapoffset); } - QImage img = - PWHelpers::SpaBufferToQImage(map, d->videoFormat.size.width, d->videoFormat.size.height, spaBuffer->datas->chunk->stride, d->videoFormat.format); - frame.image = img.copy(); - - munmap(map, spaBuffer->datas->maxsize + spaBuffer->datas->mapoffset); } else if (spaBuffer->datas->type == SPA_DATA_DmaBuf) { DmaBufAttributes attribs; attribs.planes.reserve(spaBuffer->n_datas); @@ -542,11 +552,15 @@ Q_ASSERT(!attribs.planes.isEmpty()); frame.dmabuf = attribs; } else if (spaBuffer->datas->type == SPA_DATA_MemPtr) { - frame.image = PWHelpers::SpaBufferToQImage(static_cast<uint8_t *>(spaBuffer->datas->data), - d->videoFormat.size.width, - d->videoFormat.size.height, - spaBuffer->datas->chunk->stride, - d->videoFormat.format); + if (spaBuffer->datas->chunk->size == 0) { + qCDebug(PIPEWIRE_LOGGING) << "skipping empty memptr buffer"; + } else { + frame.image = PWHelpers::SpaBufferToQImage(static_cast<uint8_t *>(spaBuffer->datas->data), + d->videoFormat.size.width, + d->videoFormat.size.height, + spaBuffer->datas->chunk->stride, + d->videoFormat.format); + } } else { if (spaBuffer->datas->type == SPA_ID_INVALID) qWarning() << "invalid buffer type";