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";

Reply via email to