kpipewire (6.3.6-1) unstable; urgency=medium
authorAurélien COUDERC <coucouf@debian.org>
Tue, 15 Jul 2025 14:45:40 +0000 (16:45 +0200)
committerAurélien COUDERC <coucouf@debian.org>
Tue, 15 Jul 2025 14:45:40 +0000 (16:45 +0200)
  [ Aurélien COUDERC ]
  * Fix incorrect backport of commit 0ac4aa41 that broke desktop
    sharing. (Closes: #1109233, thanks Antonio Russo for the detailed
    analysis !)
  * New upstream release (6.3.6).
    - Fix build with Qt 6.10.
  * Refresh patches.
  * Backport upstream commit: [9fe7a568] Adjust timers from the correct
    thread

[dgit import unpatched kpipewire 6.3.6-1]

30 files changed:
1  2 
debian/changelog
debian/control
debian/copyright
debian/libkpipewire-data.install
debian/libkpipewire-dev.install
debian/libkpipewire6.install
debian/libkpipewire6.symbols
debian/libkpipewiredmabuf6.install
debian/libkpipewiredmabuf6.symbols
debian/libkpipewirerecord6.install
debian/libkpipewirerecord6.symbols
debian/patches/series
debian/patches/upstream_0ac4aa41_encodedstream-Deprecate-setActive-and-replace-with-an-explicit-API.patch
debian/patches/upstream_123ae0d2_Tweak-encoding-options-for-VP9.patch
debian/patches/upstream_52911b70_Change-Encoder-applyEncodingPreference-to-buildEncodingOptions-.patch
debian/patches/upstream_5a223fe4_Port-Encoder-away-from-deprecated-avcodec-close.patch
debian/patches/upstream_686df1e3_Tweak-compiler-warning-flags-to-reduce-unneeded-output.patch
debian/patches/upstream_8793ae86_encodedstream-Don-t-query-VAAPI-in-the-constructor.patch
debian/patches/upstream_9fe7a568_Adjust-timers-from-the-correct-thread.patch
debian/patches/upstream_c928ed5c_Add-logging-of-encoding-options-if-log-level-is-set-to-info.patch
debian/patches/upstream_f127a2cc_Set-threads-option-by-default-in-Encoder.patch
debian/qml6-module-org-kde-pipewire.install
debian/rules
debian/salsa-ci.yml
debian/salsa/extra_repository.list
debian/salsa/qt-kde-team.debian.net.asc
debian/source/format
debian/upstream/metadata
debian/upstream/signing-key.asc
debian/watch

index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..17d4fbf7444dd2b056d9b79db1af24bbdb9e4fb2
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,314 @@@
++kpipewire (6.3.6-1) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * Fix incorrect backport of commit 0ac4aa41 that broke desktop
++    sharing. (Closes: #1109233, thanks Antonio Russo for the detailed
++    analysis !)
++  * New upstream release (6.3.6).
++    - Fix build with Qt 6.10.
++  * Refresh patches.
++  * Backport upstream commit: [9fe7a568] Adjust timers from the correct
++    thread
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Tue, 15 Jul 2025 16:45:40 +0200
++
++kpipewire (6.3.5-1) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (6.3.5).
++  * Backport upstream commits:
++    - Fix major VP9 encoding performance issue in apps using kpipewire like
++    spectacle by actually passing the encoding options to FFmpeg. (kde#488896)
++    - Correctly handle asynchronous request and feedback of encoding status
++    changes.
++    - Improve encoding startup performance by only querying VAAPI when
++    actually necessary.
++  * Update symbols from build for 6.3.5.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Mon, 19 May 2025 00:58:37 +0200
++
++kpipewire (6.3.4-1) unstable; urgency=medium
++
++  [ Patrick Franz ]
++  * New upstream release (6.3.4).
++  * Bump Standards-Version to 4.7.2 (No changes needed).
++
++ -- Patrick Franz <deltaone@debian.org>  Thu, 03 Apr 2025 00:58:40 +0200
++
++kpipewire (6.3.2-1) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (6.3.1).
++  * New upstream release (6.3.2).
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Fri, 28 Feb 2025 00:51:21 +0100
++
++kpipewire (6.3.0-1) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (6.3.0).
++  * Update build-deps and deps with the info from cmake.
++  * Release to unstable.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Mon, 10 Feb 2025 14:55:52 +0100
++
++kpipewire (6.2.91-1) experimental; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (6.2.91).
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Thu, 23 Jan 2025 23:50:56 +0100
++
++kpipewire (6.2.90-1) experimental; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (6.2.90).
++  * Update build-deps and deps with the info from cmake.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Sat, 11 Jan 2025 23:06:13 +0100
++
++kpipewire (6.2.5-1) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (6.2.5).
++  * Update build-deps and deps with the info from cmake.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Sun, 05 Jan 2025 10:56:47 +0100
++
++kpipewire (6.2.4-1) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (6.2.4).
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Tue, 03 Dec 2024 16:21:59 +0100
++
++kpipewire (6.2.3-1) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (6.2.3).
++  * Release to unstable.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Mon, 25 Nov 2024 23:14:35 +0100
++
++kpipewire (6.2.1-2) experimental; urgency=medium
++
++  * Team upload.
++
++  [ Sandro Knauß ]
++  * Use dh_qmldeps to detect QML dependencies.
++  * Add qml6-module packages to -dev package for QML dependency detection.
++
++ -- Sandro Knauß <hefee@debian.org>  Mon, 25 Nov 2024 19:20:39 +0100
++
++kpipewire (6.2.1-1) experimental; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (6.2.1).
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Tue, 15 Oct 2024 17:45:45 +0200
++
++kpipewire (6.2.0-1) experimental; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (6.1.90).
++  * Update build-deps and deps with the info from cmake.
++  * New upstream release (6.2.0).
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Sat, 05 Oct 2024 23:17:41 +0200
++
++kpipewire (6.1.5-1) experimental; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (6.1.5).
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Wed, 11 Sep 2024 23:27:36 +0200
++
++kpipewire (6.1.4-1) experimental; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (6.1.4).
++  * Update symbols from build for 6.1.4.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Sun, 11 Aug 2024 23:58:17 +0200
++
++kpipewire (6.1.3-1) experimental; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (6.1.3).
++  * Update build-deps and deps with the info from cmake.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Sun, 21 Jul 2024 23:46:10 +0200
++
++kpipewire (6.1.0-2) experimental; urgency=medium
++
++  * Team upload.
++  * Update the symbols files from the logs of buildds.
++
++ -- Pino Toscano <pino@debian.org>  Sat, 22 Jun 2024 06:57:59 +0200
++
++kpipewire (6.1.0-1) experimental; urgency=medium
++
++  [ Patrick Franz ]
++  * New upstream release (6.1.0).
++  * Create new packages.
++  * Update d/copyright.
++
++ -- Patrick Franz <deltaone@debian.org>  Thu, 20 Jun 2024 12:37:54 +0200
++
++kpipewire (5.27.11-1) unstable; urgency=medium
++
++  [ Patrick Franz ]
++  * Bump Standards-Version to 4.7.0 (No changes needed).
++  * New upstream release (5.27.11).
++  * Update build-deps and deps with the info from cmake.
++
++ -- Patrick Franz <deltaone@debian.org>  Sun, 19 May 2024 12:20:52 +0200
++
++kpipewire (5.27.10-1) unstable; urgency=medium
++
++  [ Patrick Franz ]
++  * New upstream release (5.27.10).
++
++ -- Patrick Franz <deltaone@debian.org>  Thu, 11 Jan 2024 23:21:22 +0100
++
++kpipewire (5.27.9-1) unstable; urgency=medium
++
++  [ Patrick Franz ]
++  * New upstream release (5.27.9).
++
++ -- Patrick Franz <deltaone@debian.org>  Fri, 27 Oct 2023 21:51:12 +0200
++
++kpipewire (5.27.8-1) unstable; urgency=medium
++
++  [ Patrick Franz ]
++  * New upstream release (5.27.8).
++
++ -- Patrick Franz <deltaone@debian.org>  Wed, 13 Sep 2023 20:48:20 +0200
++
++kpipewire (5.27.7-1) unstable; urgency=medium
++
++  [ Pino Toscano ]
++  * Add the libpipewire-0.3-dev dependency in libkpipewire-dev, as the kpipewire
++    headers include pipewire headers.
++
++  [ Patrick Franz ]
++  * New upstream release (5.27.7).
++
++ -- Patrick Franz <deltaone@debian.org>  Thu, 03 Aug 2023 18:52:16 +0200
++
++kpipewire (5.27.5-3) unstable; urgency=medium
++
++  * Release to unstable.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Sat, 27 May 2023 18:23:40 +0200
++
++kpipewire (5.27.5-2) experimental; urgency=medium
++
++  [ Patrick Franz ]
++  * Update symbols from buildlogs.
++
++ -- Patrick Franz <deltaone@debian.org>  Wed, 10 May 2023 07:43:09 +0200
++
++kpipewire (5.27.5-1) experimental; urgency=medium
++
++  [ Patrick Franz ]
++  * New upstream release (5.27.5).
++  * Update symbols from buildlogs.
++
++ -- Patrick Franz <deltaone@debian.org>  Tue, 09 May 2023 23:26:05 +0200
++
++kpipewire (5.27.3-1) experimental; urgency=medium
++
++  [ Patrick Franz ]
++  * New upstream release (5.27.3).
++  * Add myself to Uploaders.
++
++ -- Patrick Franz <deltaone@debian.org>  Wed, 22 Mar 2023 23:17:25 +0100
++
++kpipewire (5.27.2-1) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (5.27.1).
++  * New upstream release (5.27.2).
++  * Update symbols from build for 5.27.2.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Tue, 28 Feb 2023 18:45:16 +0100
++
++kpipewire (5.27.0-1) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (5.27.0).
++  * Update build-deps and deps with the info from cmake.
++  * Update symbols from build for 5.27.0.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Sat, 18 Feb 2023 17:08:36 +0100
++
++kpipewire (5.26.90-2) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * Release to unstable.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Mon, 23 Jan 2023 21:50:52 +0100
++
++kpipewire (5.26.90-1) experimental; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (5.26.90).
++  * Bump Standards-Version to 4.6.2, no change required.
++  * Add new libkpipewiredmabuf5 library package.
++  * Update symbols from build for 5.26.90.
++  * Limit binary packages to linux-any architectures where PipeWire
++    exists.
++  * Replace libegl1-mesa-dev build dependency with libegl-dev.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Sun, 22 Jan 2023 01:37:10 +0100
++
++kpipewire (5.26.5-1) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (5.26.5).
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Sat, 07 Jan 2023 00:20:22 +0100
++
++kpipewire (5.26.4-1) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (5.26.4).
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Tue, 29 Nov 2022 15:59:28 +0100
++
++kpipewire (5.26.3-1) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (5.26.3).
++  * Update build-deps and deps with the info from cmake.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Tue, 08 Nov 2022 15:42:23 +0100
++
++kpipewire (5.26.2-1) unstable; urgency=medium
++
++  [ Aurélien COUDERC ]
++  * New upstream release (5.26.2).
++  * Update build-deps and deps with the info from cmake.
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Sun, 06 Nov 2022 23:06:09 +0100
++
++kpipewire (5.26.0-2) unstable; urgency=medium
++
++  * Team upload.
++  * Modernize the building more:
++    - add the dh-sequence-pkgkde-symbolshelper build dependency to use the
++      pkgkde_symbolshelper automatically
++    - drop the manually specified pkgkde_symbolshelper addon for dh
++  * Tighten the inter-library dependencies.
++  * Add the configuration for the CI on salsa.
++  * Explicitly add the gettext, and pkg-config build dependencies.
++
++ -- Pino Toscano <pino@debian.org>  Fri, 04 Nov 2022 09:25:00 +0100
++
++kpipewire (5.26.0-1) unstable; urgency=medium
++
++  [ Rik Mills ]
++  * Initial release. (Closes: #1021573)
++
++ -- Aurélien COUDERC <coucouf@debian.org>  Tue, 11 Oct 2022 00:39:13 +0200
diff --cc debian/control
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8de4bd4fb77ad638d88821a5ca7163572288ef90
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,108 @@@
++Source: kpipewire
++Section: libs
++Priority: optional
++Maintainer: Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
++Uploaders: Aurélien COUDERC <coucouf@debian.org>,
++           Patrick Franz <deltaone@debian.org>,
++Build-Depends: debhelper-compat (= 13),
++               dh-sequence-kf6,
++               dh-sequence-pkgkde-symbolshelper,
++               dh-sequence-qmldeps,
++               cmake (>= 3.16~),
++               extra-cmake-modules (>= 6.10.0~),
++               gettext,
++               libavcodec-dev,
++               libavfilter-dev,
++               libavformat-dev,
++               libavutil-dev,
++               libdrm-dev (>= 2.4.62~),
++               libegl-dev,
++               libepoxy-dev (>= 1.3~),
++               libgbm-dev,
++               libkf6coreaddons-dev (>= 6.2.0~),
++               libkf6i18n-dev (>= 6.2.0~),
++               libpipewire-0.3-dev,
++               libswscale-dev,
++               libva-dev,
++               libwayland-dev,
++               libxkbcommon-dev,
++               pipewire-bin,
++               pkgconf,
++               plasma-wayland-protocols,
++               qt6-base-dev (>= 6.6.0+dfsg~),
++               qt6-base-private-dev (>= 6.6.0+dfsg~),
++               qt6-declarative-dev (>= 6.6.0+dfsg~),
++               qt6-declarative-private-dev (>= 6.6.0+dfsg~),
++               qt6-wayland-dev (>= 6.6.0~),
++Standards-Version: 4.7.2
++Homepage: https://invent.kde.org/plasma/kpipewire
++Vcs-Browser: https://salsa.debian.org/qt-kde-team/kde/kpipewire
++Vcs-Git: https://salsa.debian.org/qt-kde-team/kde/kpipewire.git
++Rules-Requires-Root: no
++
++Package: libkpipewire-data
++Architecture: all
++Multi-Arch: foreign
++Depends: ${misc:Depends},
++Description: KDE's Pipewire libraries - data files
++ Components for rendering and recording PipeWire streams using Qt.
++ .
++ This package contains the library data files.
++
++Package: libkpipewire-dev
++Section: libdevel
++Architecture: linux-any
++Multi-Arch: same
++Depends: libkpipewire6 (= ${binary:Version}),
++         libkpipewiredmabuf6 (= ${binary:Version}),
++         libkpipewirerecord6 (= ${binary:Version}),
++         libpipewire-0.3-dev,
++         qml6-module-org-kde-pipewire (= ${binary:Version}),
++         qt6-base-dev (>= 6.6.0+dfsg~),
++         ${misc:Depends},
++Description: KDE's Pipewire libraries - development files
++ Components for rendering and recording PipeWire streams using Qt.
++ .
++ This package contains the library development files.
++
++Package: libkpipewire6
++Architecture: linux-any
++Multi-Arch: same
++Depends: libkpipewire-data (= ${source:Version}),
++         ${misc:Depends},
++         ${shlibs:Depends},
++Description: KDE's Pipewire libraries - libkpipewire6 library
++ Components for rendering and recording PipeWire streams using Qt.
++ .
++ This package contains the kpipewire main library.
++
++Package: libkpipewiredmabuf6
++Architecture: linux-any
++Multi-Arch: same
++Depends: libkpipewire-data (= ${source:Version}),
++         ${misc:Depends},
++         ${shlibs:Depends},
++Description: KDE's Pipewire libraries - libkpipewiredmabuf6
++ Components for rendering and recording PipeWire streams using Qt.
++ .
++ This package contains the kpipewiredmabuf library.
++
++Package: libkpipewirerecord6
++Architecture: linux-any
++Multi-Arch: same
++Depends: libkpipewire-data (= ${source:Version}),
++         ${misc:Depends},
++         ${shlibs:Depends},
++Description: KDE's Pipewire libraries - libkpipewirerecord6
++ Components for rendering and recording PipeWire streams using Qt.
++ .
++ This package contains the kpipewirerecord library.
++
++Package: qml6-module-org-kde-pipewire
++Architecture: linux-any
++Multi-Arch: same
++Depends: ${misc:Depends}, ${qml6:Depends}, ${shlibs:Depends},
++Description: KDE's Pipewire libraries - QML module
++ Components for rendering and recording PipeWire streams using Qt.
++ .
++ This package contains the QtQuick module.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..54903687512ba4b73a4b406745e4dd313383beba
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,183 @@@
++Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
++Upstream-Name: kpipewire
++Source: https://invent.kde.org/plasma/kpipewire
++Upstream-Contact: plasma-devel@kde.org
++
++Files: *
++Copyright: 2020-2023, Aleix Pol Gonzalez <aleixpol@kde.org>
++           2023 Arjen Hiemstra <ahiemstra@heimr.nl>
++           Jan Grulich <jgrulich@redhat.com>
++           2023 Marco Martin <mart@kde.org>
++           2023 Noah Davis <noahadvs@gmail.com>
++           2018-2020, Red Hat Inc
++License: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
++
++Files: src/monitors/autotests/alarm-clock-elapsed.oga
++       src/monitors/autotests/mediamonitortest.cpp
++       src/monitors/autotests/mediamonitortest.qml
++       src/monitors/mediamonitor.cpp
++       src/monitors/mediamonitor.h
++Copyright: 2023 Fushan Wen <qydwhotmail@gmail.com>
++           2023 Collabora Ltd.
++License: GPL-2.0-or-later
++
++Files: cmake/FindLibdrm.cmake
++       src/monitors/CMakeLists.txt
++       src/monitors/autotests/CMakeLists.txt
++Copyright: 2014, Alex Merry <alex.merry@kde.org>
++           2023 Fushan Wen <qydwhotmail@gmail.com>
++           2014, Martin Gräßlin <mgraesslin@kde.org>
++License: BSD-3-clause
++
++Files: src/dmabufhandler.cpp
++Copyright: 2022 Aleix Pol i Gonzalez <aleixpol@kde.org>
++License: Apache-2.0
++
++Files: .gitlab-ci.yml
++       .kde-ci.yml
++Copyright: None
++License: CC0-1.0
++
++Files: debian/*
++Copyright: 2022-2024, Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
++           2022, Jonathan Esk-Riddell <jr@jriddell.org>
++           2022, Rik Mills <rikmills@kde.org>
++License: GPL-2.0-or-later
++
++License: BSD-3-Clause
++ Redistribution and use in source and binary forms, with or without
++ modification, are permitted provided that the following conditions
++ are met:
++ .
++ 1. Redistributions of source code must retain the above copyright
++    notice, this list of conditions and the following disclaimer.
++ .
++ 2. Redistributions in binary form must reproduce the above copyright
++    notice, this list of conditions and the following disclaimer in
++    the documentation and/or other materials provided with the
++    distribution.
++ .
++ 3. Neither the name of the copyright holder nor the names of its
++    contributors may be used to endorse or promote products derived
++    from this software without specific prior written permission.
++ .
++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
++ COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
++ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
++ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
++ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
++ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
++ POSSIBILITY OF SUCH DAMAGE.
++
++License: GPL-2.0-or-later
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++ .
++ This program is distributed in the hope that it will be useful, but
++ WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ General Public License for more details.
++ .
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
++ 02110-1301, USA. Also add information on how to contact you by
++ electronic and paper mail.
++ .
++ On Debian systems, the complete text of the GNU General Public
++ License version 2 can be found in
++ `/usr/share/common-licenses/GPL-2’.
++
++License: LGPL-2.1-only
++ This library is free software; you can redistribute it and/or modify
++ it under the terms of the GNU Lesser General Public License version
++ 2.1 as published by the Free Software Foundation.
++ .
++ This library is distributed in the hope that it will be useful, but
++ WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ Lesser General Public License for more details.
++ .
++ You should have received a copy of the GNU Lesser General Public
++ License along with this library; if not, write to the Free Software
++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
++ 02110-1301  USA Also add information on how to contact you by
++ electronic and paper mail.
++ .
++ On Debian systems, the complete text of the GNU Lesser General
++ Public License version 2.1 can be found in
++ `/usr/share/common-licenses/LGPL-2.1’.
++
++License: LGPL-3.0-only
++ This library is free software; you can redistribute it and/or modify
++ it under the terms of the GNU Lesser General Public License version
++ 3 as published by the Free Software Foundation.
++ .
++ This library is distributed in the hope that it will be useful, but
++ WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ Lesser General Public License for more details.
++ .
++ You should have received a copy of the GNU Lesser General Public
++ License along with this library.  If not, see
++ <http://www.gnu.org/licenses/>.
++ .
++ On Debian systems, the complete text of the GNU Lesser General
++ Public License version 3 can be found in
++ `/usr/share/common-licenses/LGPL-3’.
++
++License: LicenseRef-KDE-Accepted-LGPL
++ This library is free software; you can redistribute it and/or modify
++ it under the terms of the GNU Lesser General Public License as
++ published by the Free Software Foundation; either version 3 of the
++ license or (at your option) any later version that is accepted by
++ the membership of KDE e.V. (or its successor approved by the
++ membership of KDE e.V.), which shall act as a proxy as defined in
++ Section 6 of version 3 of the license.
++ .
++ This program is distributed in the hope that it will be useful, but
++ WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ General Public License for more details.
++
++License: CC0-1.0
++ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL
++ SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT
++ RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS.
++ CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR
++ THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR
++ DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
++ PROVIDED HEREUNDER.
++ .
++ Statement of Purpose
++ .
++ The laws of most jurisdictions throughout the world automatically confer
++ exclusive Copyright and Related Rights (defined below) upon the creator and
++ subsequent owner(s) (each and all, an "owner") of an original work of
++ authorship and/or a database (each, a "Work").
++ .
++ On Debian systems, the complete text of the Creative Commons Zero v1.0 Universal
++ license can be found in "/usr/share/common-licenses/CC0-1.0".
++
++License: Apache-2.0
++  Licensed under the Apache License, Version 2.0 (the "License");
++ you may not use this file except in compliance with the License.
++ You may obtain a copy of the License at
++ .
++     http://www.apache.org/licenses/LICENSE-2.0
++ .
++ Unless required by applicable law or agreed to in writing, software
++ distributed under the License is distributed on an "AS IS" BASIS,
++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ See the License for the specific language governing permissions and
++ limitations under the License.
++ .
++ On Debian systems, the complete text of the Apache License 2.0 can
++ be found in "/usr/share/common-licenses/Apache-2.0"
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..250a6390e43f0bbbee9c74858997aee16d9b434c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++usr/share/locale/*/*/kpipewire6.mo
++usr/share/qlogging-categories6/kpipewire.categories
++usr/share/qlogging-categories6/kpipewirerecord.categories
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d75078cc27b601bb00d9e006928319ad03fbe9b9
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++usr/include/
++usr/lib/*/cmake/
++usr/lib/*/libKPipeWire.so
++usr/lib/*/libKPipeWireDmaBuf.so
++usr/lib/*/libKPipeWireRecord.so
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..86d43d1f87404160b9036504c84527c65a070bb5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++usr/lib/*/libKPipeWire.so.6
++usr/lib/*/libKPipeWire.so.6.*
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..f719c2828b2604dc888b17eeea6e3c64aa965c39
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,161 @@@
++# SymbolsHelper-Confirmed: 6.1.4 amd64
++libKPipeWire.so.6 libkpipewire6 #MINVER#
++* Build-Depends-Package: libkpipewire-dev
++ _ZN10VaapiUtils10devicePathEv@Base 6.1.0
++ _ZN10VaapiUtils10openDeviceEPiRK10QByteArray@Base 6.1.0
++ _ZN10VaapiUtils11closeDeviceEPiPv@Base 6.1.0
++ _ZN10VaapiUtils15supportsProfileE9VAProfile@Base 6.1.0
++ _ZN10VaapiUtils15supportsProfileE9VAProfilePvRK10QByteArray@Base 6.1.0
++ (subst)_ZN10VaapiUtils16supportsModifierEj{uint64_t}@Base 6.1.0
++ _ZN10VaapiUtils21rateControlForProfileE9VAProfile12VAEntrypointPvRK10QByteArray@Base 6.1.0
++ _ZN10VaapiUtils8instanceEv@Base 6.1.0
++ _ZN10VaapiUtilsC1ENS_7PrivateE@Base 6.1.0
++ _ZN10VaapiUtilsC2ENS_7PrivateE@Base 6.1.0
++ _ZN10VaapiUtilsD1Ev@Base 6.1.0
++ _ZN10VaapiUtilsD2Ev@Base 6.1.0
++ _ZN12PipeWireCore10onCoreInfoEPvPK12pw_core_info@Base 6.1.0
++ _ZN12PipeWireCore10pipeBrokenEv@Base 6.1.0
++ _ZN12PipeWireCore11onCoreErrorEPvjiiPKc@Base 6.1.0
++ _ZN12PipeWireCore11qt_metacallEN11QMetaObject4CallEiPPv@Base 6.1.0
++ _ZN12PipeWireCore11qt_metacastEPKc@Base 6.1.0
++ _ZN12PipeWireCore14pipewireFailedERK7QString@Base 6.1.0
++ _ZN12PipeWireCore14s_pwCoreEventsE@Base 6.1.0
++ _ZN12PipeWireCore16staticMetaObjectE@Base 6.1.0
++ _ZN12PipeWireCore4initEi@Base 6.1.0
++ _ZN12PipeWireCore5fetchEi@Base 6.1.0
++ _ZN12PipeWireCore9init_coreEv@Base 6.1.0
++ _ZN12PipeWireCoreC1Ev@Base 6.1.0
++ _ZN12PipeWireCoreC2Ev@Base 6.1.0
++ _ZN12PipeWireCoreD0Ev@Base 6.1.0
++ _ZN12PipeWireCoreD1Ev@Base 6.1.0
++ _ZN12PipeWireCoreD2Ev@Base 6.1.0
++ _ZN17PipeWireFrameDataC1E16spa_video_formatPv5QSizeiP28PipeWireFrameCleanupFunction@Base 6.1.0
++ _ZN17PipeWireFrameDataC2E16spa_video_formatPv5QSizeiP28PipeWireFrameCleanupFunction@Base 6.1.0
++ _ZN17PipeWireFrameDataD1Ev@Base 6.1.0
++ _ZN17PipeWireFrameDataD2Ev@Base 6.1.0
++ _ZN18PipeWireSourceItem10itemChangeEN10QQuickItem10ItemChangeERKNS0_14ItemChangeDataE@Base 6.1.0
++ _ZN18PipeWireSourceItem11qt_metacallEN11QMetaObject4CallEiPPv@Base 6.1.0
++ _ZN18PipeWireSourceItem11qt_metacastEPKc@Base 6.1.0
++ _ZN18PipeWireSourceItem12processFrameERK13PipeWireFrame@Base 6.1.0
++ _ZN18PipeWireSourceItem12readyChangedEv@Base 6.1.0
++ _ZN18PipeWireSourceItem12stateChangedEv@Base 6.1.0
++ _ZN18PipeWireSourceItem13nodeIdChangedEj@Base 6.1.0
++ _ZN18PipeWireSourceItem14setAllowDmaBufEb@Base 6.1.0
++ _ZN18PipeWireSourceItem15updatePaintNodeEP7QSGNodePN10QQuickItem19UpdatePaintNodeDataE@Base 6.1.0
++ _ZN18PipeWireSourceItem16releaseResourcesEv@Base 6.1.0
++ _ZN18PipeWireSourceItem16staticMetaObjectE@Base 6.1.0
++ _ZN18PipeWireSourceItem17componentCompleteEv@Base 6.1.0
++ _ZN18PipeWireSourceItem17streamSizeChangedEv@Base 6.1.0
++ _ZN18PipeWireSourceItem18updateTextureImageERKSt10shared_ptrI17PipeWireFrameDataE@Base 6.1.0
++ _ZN18PipeWireSourceItem18usingDmaBufChangedEv@Base 6.1.0
++ _ZN18PipeWireSourceItem19updateTextureDmaBufERK16DmaBufAttributes16spa_video_format@Base 6.1.0
++ _ZN18PipeWireSourceItem5setFdEj@Base 6.1.0
++ _ZN18PipeWireSourceItem7refreshEv@Base 6.1.0
++ _ZN18PipeWireSourceItem7resetFdEv@Base 6.1.0
++ _ZN18PipeWireSourceItem8setReadyEb@Base 6.1.0
++ _ZN18PipeWireSourceItem9fdChangedEj@Base 6.1.0
++ _ZN18PipeWireSourceItem9setNodeIdEj@Base 6.1.0
++ _ZN18PipeWireSourceItemC1EP10QQuickItem@Base 6.1.0
++ _ZN18PipeWireSourceItemC2EP10QQuickItem@Base 6.1.0
++ _ZN18PipeWireSourceItemD0Ev@Base 6.1.0
++ _ZN18PipeWireSourceItemD1Ev@Base 6.1.0
++ _ZN18PipeWireSourceItemD2Ev@Base 6.1.0
++ _ZN20PipeWireSourceStream10coreFailedERK7QString@Base 6.1.0
++ _ZN20PipeWireSourceStream11handleFrameEP9pw_buffer@Base 6.1.0
++ _ZN20PipeWireSourceStream11qt_metacallEN11QMetaObject4CallEiPPv@Base 6.1.0
++ _ZN20PipeWireSourceStream11qt_metacastEPKc@Base 6.1.0
++ _ZN20PipeWireSourceStream11streamReadyEv@Base 6.1.0
++ _ZN20PipeWireSourceStream12createStreamEji@Base 6.1.0
++ _ZN20PipeWireSourceStream12setUsageHintENS_9UsageHintE@Base 6.1.0
++ _ZN20PipeWireSourceStream12stateChangedE15pw_stream_stateS0_@Base 6.1.0
++ _ZN20PipeWireSourceStream13frameReceivedERK13PipeWireFrame@Base 6.1.0
++ (subst)_ZN20PipeWireSourceStream13onRenegotiateEPv{uint64_t}@Base 6.1.0
++ _ZN20PipeWireSourceStream13stopStreamingEv@Base 6.1.0
++ _ZN20PipeWireSourceStream14setAllowDmaBufEb@Base 6.1.0
++ _ZN20PipeWireSourceStream14startStreamingEv@Base 6.1.0
++ _ZN20PipeWireSourceStream15setMaxFramerateERK8Fraction@Base 6.1.0
++ _ZN20PipeWireSourceStream16setDamageEnabledEb@Base 6.1.0
++ _ZN20PipeWireSourceStream16staticMetaObjectE@Base 6.1.0
++ _ZN20PipeWireSourceStream19createFormatsParamsE15spa_pod_builder@Base 6.1.0
++ _ZN20PipeWireSourceStream20onStreamParamChangedEPvjPK7spa_pod@Base 6.1.0
++ _ZN20PipeWireSourceStream20onStreamStateChangedEPv15pw_stream_stateS1_PKc@Base 6.1.0
++ _ZN20PipeWireSourceStream23streamParametersChangedEv@Base 6.1.0
++ _ZN20PipeWireSourceStream25renegotiateModifierFailedE16spa_video_formaty@Base 6.1.0
++ _ZN20PipeWireSourceStream25spaVideoFormatToDrmFormatE16spa_video_format@Base 6.1.0
++ _ZN20PipeWireSourceStream6nodeIdEv@Base 6.1.0
++ _ZN20PipeWireSourceStream7processEv@Base 6.1.0
++ _ZN20PipeWireSourceStream9onDestroyEPv@Base 6.1.4
++ _ZN20PipeWireSourceStream9setActiveEb@Base 6.1.0
++ _ZN20PipeWireSourceStreamC1EP7QObject@Base 6.1.0
++ _ZN20PipeWireSourceStreamC2EP7QObject@Base 6.1.0
++ _ZN20PipeWireSourceStreamD0Ev@Base 6.1.0
++ _ZN20PipeWireSourceStreamD1Ev@Base 6.1.0
++ _ZN20PipeWireSourceStreamD2Ev@Base 6.1.0
++ _ZN9GLHelpers11createImageEPvRK16DmaBufAttributesjRK5QSizeP10gbm_device@Base 6.1.0
++ _ZN9GLHelpers13formatGLErrorEj@Base 6.1.0
++ _ZN9GLHelpers14formatEGLErrorEj@Base 6.1.0
++ _ZN9GLHelpers15initDebugOutputEv@Base 6.1.0
++ (subst)_ZN9PWHelpers17SpaBufferToQImageEPKhii{qptrdiff}16spa_video_formatP28PipeWireFrameCleanupFunction@Base 6.1.0
++ _ZNK10VaapiUtils11maximumSizeEv@Base 6.1.0
++ _ZNK10VaapiUtils11minimumSizeEv@Base 6.1.0
++ _ZNK10VaapiUtils12supportsH264ERK10QByteArray@Base 6.1.0
++ _ZNK10VaapiUtils20querySizeConstraintsEPv@Base 6.1.0
++ _ZNK12PipeWireCore10metaObjectEv@Base 6.1.0
++ _ZNK12PipeWireCore5errorEv@Base 6.1.0
++ _ZNK17PipeWireFrameData4copyEv@Base 6.1.0
++ _ZNK17PipeWireFrameData7toImageEv@Base 6.1.0
++ _ZNK18PipeWireSourceItem10metaObjectEv@Base 6.1.0
++ _ZNK18PipeWireSourceItem10streamSizeEv@Base 6.1.0
++ _ZNK18PipeWireSourceItem11allowDmaBufEv@Base 6.1.0
++ _ZNK18PipeWireSourceItem11usingDmaBufEv@Base 6.1.0
++ _ZNK18PipeWireSourceItem2fdEv@Base 6.1.0
++ _ZNK18PipeWireSourceItem5errorEv@Base 6.1.0
++ _ZNK18PipeWireSourceItem5stateEv@Base 6.1.0
++ _ZNK18PipeWireSourceItem6nodeIdEv@Base 6.1.0
++ _ZNK18PipeWireSourceItem7isReadyEv@Base 6.1.0
++ _ZNK20PipeWireSourceStream10metaObjectEv@Base 6.1.0
++ _ZNK20PipeWireSourceStream11allowDmaBufEv@Base 6.1.0
++ _ZNK20PipeWireSourceStream11usingDmaBufEv@Base 6.1.0
++ _ZNK20PipeWireSourceStream28currentPresentationTimestampEv@Base 6.1.0
++ _ZNK20PipeWireSourceStream4sizeEv@Base 6.1.0
++ _ZNK20PipeWireSourceStream5errorEv@Base 6.1.0
++ _ZNK20PipeWireSourceStream5stateEv@Base 6.1.0
++ _ZNK20PipeWireSourceStream9framerateEv@Base 6.1.0
++ _ZNK20PipeWireSourceStream9usageHintEv@Base 6.1.0
++ _ZTI12PipeWireCore@Base 6.1.0
++ _ZTI18PipeWireSourceItem@Base 6.1.0
++ _ZTI20PipeWireSourceStream@Base 6.1.0
++ (arch=armel riscv64)_ZTIN9__gnu_cxx7__mutexE@Base 6.1.0
++ (arch=armel riscv64)_ZTISt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=!armel !riscv64)_ZTISt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ (arch=armel riscv64)_ZTISt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=!armel !riscv64)_ZTISt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ (arch=armel armhf)_ZTISt19_Sp_make_shared_tag@Base 6.1.0
++ (arch=armel riscv64)_ZTISt23_Sp_counted_ptr_inplaceI10VaapiUtilsSaIvELN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=!armel !riscv64)_ZTISt23_Sp_counted_ptr_inplaceI10VaapiUtilsSaIvELN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ (arch=armel riscv64)_ZTISt23_Sp_counted_ptr_inplaceI17PipeWireFrameDataSaIvELN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=!armel !riscv64)_ZTISt23_Sp_counted_ptr_inplaceI17PipeWireFrameDataSaIvELN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ _ZTS12PipeWireCore@Base 6.1.0
++ _ZTS18PipeWireSourceItem@Base 6.1.0
++ _ZTS20PipeWireSourceStream@Base 6.1.0
++ (arch=armel riscv64)_ZTSN9__gnu_cxx7__mutexE@Base 6.1.0
++ (arch=armel riscv64)_ZTSSt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=!armel !riscv64)_ZTSSt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ (arch=armel riscv64)_ZTSSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=!armel !riscv64)_ZTSSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ _ZTSSt19_Sp_make_shared_tag@Base 6.1.0
++ (arch=armel riscv64)_ZTSSt23_Sp_counted_ptr_inplaceI10VaapiUtilsSaIvELN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=!armel !riscv64)_ZTSSt23_Sp_counted_ptr_inplaceI10VaapiUtilsSaIvELN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ (arch=armel riscv64)_ZTSSt23_Sp_counted_ptr_inplaceI17PipeWireFrameDataSaIvELN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=!armel !riscv64)_ZTSSt23_Sp_counted_ptr_inplaceI17PipeWireFrameDataSaIvELN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ _ZTV12PipeWireCore@Base 6.1.0
++ _ZTV18PipeWireSourceItem@Base 6.1.0
++ _ZTV20PipeWireSourceStream@Base 6.1.0
++ (arch=armel riscv64)_ZTVSt23_Sp_counted_ptr_inplaceI10VaapiUtilsSaIvELN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=!armel !riscv64)_ZTVSt23_Sp_counted_ptr_inplaceI10VaapiUtilsSaIvELN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ (arch=armel riscv64)_ZTVSt23_Sp_counted_ptr_inplaceI17PipeWireFrameDataSaIvELN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=!armel !riscv64)_ZTVSt23_Sp_counted_ptr_inplaceI17PipeWireFrameDataSaIvELN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ _ZZNSt19_Sp_make_shared_tag5_S_tiEvE5__tag@Base 6.1.0
++ (optional=templinst)_ZZNSt9once_flag18_Prepare_executionC4IZSt9call_onceIRFvvEJEEvRS_OT_DpOT0_EUlvE_EERS6_ENUlvE_4_FUNEv@Base 6.1.0
++ (c++)"non-virtual thunk to PipeWireSourceItem::componentComplete()@Base" 6.1.0
++ (c++)"non-virtual thunk to PipeWireSourceItem::~PipeWireSourceItem()@Base" 6.1.0
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5d9bcd9d0088a355ec5d133bfb99cc345fa1e315
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++usr/lib/*/libKPipeWireDmaBuf.so.6
++usr/lib/*/libKPipeWireDmaBuf.so.6.*
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..142c2db256b3386dd7b8ed3f5553716672438aad
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,9 @@@
++# SymbolsHelper-Confirmed: 6.1.0 amd64
++libKPipeWireDmaBuf.so.6 libkpipewiredmabuf6 #MINVER#
++* Build-Depends-Package: libkpipewire-dev
++ _ZN13DmaBufHandler13downloadFrameER6QImageRK13PipeWireFrame@Base 6.1.0
++ _ZN13DmaBufHandler8setupEglEv@Base 6.1.0
++ _ZN13DmaBufHandlerC1Ev@Base 6.1.0
++ _ZN13DmaBufHandlerC2Ev@Base 6.1.0
++ _ZN13DmaBufHandlerD1Ev@Base 6.1.0
++ _ZN13DmaBufHandlerD2Ev@Base 6.1.0
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c4002d331f9a7735750bb9282f6667ba5881ff48
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++usr/lib/*/libKPipeWireRecord.so.6
++usr/lib/*/libKPipeWireRecord.so.6.*
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..dd0fbfe1f6e74077012ae2a2effa2f793ea87998
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,94 @@@
++# SymbolsHelper-Confirmed: 6.3.5 amd64
++libKPipeWireRecord.so.6 libkpipewirerecord6 #MINVER#
++* Build-Depends-Package: libkpipewire-dev
++ _ZN14PipeWireRecord11makeProduceEv@Base 6.1.0
++ _ZN14PipeWireRecord11qt_metacallEN11QMetaObject4CallEiPPv@Base 6.1.0
++ _ZN14PipeWireRecord11qt_metacastEPKc@Base 6.1.0
++ _ZN14PipeWireRecord13outputChangedERK7QString@Base 6.1.0
++ _ZN14PipeWireRecord16staticMetaObjectE@Base 6.1.0
++ _ZN14PipeWireRecord9setOutputERK7QString@Base 6.1.0
++ _ZN14PipeWireRecordC1EP7QObject@Base 6.1.0
++ _ZN14PipeWireRecordC2EP7QObject@Base 6.1.0
++ _ZN14PipeWireRecordD0Ev@Base 6.1.0
++ _ZN14PipeWireRecordD1Ev@Base 6.1.0
++ _ZN14PipeWireRecordD2Ev@Base 6.1.0
++ _ZN21PipeWireEncodedStream11makeProduceEv@Base 6.1.0
++ _ZN21PipeWireEncodedStream11qt_metacallEN11QMetaObject4CallEiPPv@Base 6.1.0
++ _ZN21PipeWireEncodedStream11qt_metacastEPKc@Base 6.1.0
++ _ZN21PipeWireEncodedStream11sizeChangedERK5QSize@Base 6.1.0
++ _ZN21PipeWireEncodedStream13cursorChangedERK14PipeWireCursor@Base 6.1.0
++ _ZN21PipeWireEncodedStream16staticMetaObjectE@Base 6.1.0
++ _ZN21PipeWireEncodedStream6PacketC1EbRK10QByteArray@Base 6.1.0
++ _ZN21PipeWireEncodedStream6PacketC2EbRK10QByteArray@Base 6.1.0
++ _ZN21PipeWireEncodedStream9newPacketERKNS_6PacketE@Base 6.1.0
++ _ZN21PipeWireEncodedStreamC1EP7QObject@Base 6.1.0
++ _ZN21PipeWireEncodedStreamC2EP7QObject@Base 6.1.0
++ _ZN21PipeWireEncodedStreamD0Ev@Base 6.1.0
++ _ZN21PipeWireEncodedStreamD1Ev@Base 6.1.0
++ _ZN21PipeWireEncodedStreamD2Ev@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream10errorFoundERK7QString@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream10setEncoderENS_7EncoderE@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream10setQualityEh@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream11qt_metacallEN11QMetaObject4CallEiPPv@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream11qt_metacastEPKc@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream12stateChangedEv@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream13activeChangedEb@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream13nodeIdChangedEj@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream14encoderChangedEv@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream15setMaxFramerateERK8Fraction@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream15setMaxFramerateEjj@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream16staticMetaObjectE@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream18encodingPreferenceEv@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream19maxFramerateChangedEv@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream19setMaxPendingFramesEi@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream21setEncodingPreferenceENS_18EncodingPreferenceE@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream23maxPendingFramesChangedEv@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream4stopEv@Base 6.3.5
++ _ZN25PipeWireBaseEncodedStream5setFdEj@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream5startEv@Base 6.3.5
++ _ZN25PipeWireBaseEncodedStream9fdChangedEj@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream9setActiveEb@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStream9setNodeIdEj@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStreamC1EP7QObject@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStreamC2EP7QObject@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStreamD0Ev@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStreamD1Ev@Base 6.1.0
++ _ZN25PipeWireBaseEncodedStreamD2Ev@Base 6.1.0
++ _ZNK14PipeWireRecord10metaObjectEv@Base 6.1.0
++ _ZNK14PipeWireRecord6outputEv@Base 6.1.0
++ _ZNK14PipeWireRecord9extensionEv@Base 6.1.0
++ _ZNK21PipeWireEncodedStream10metaObjectEv@Base 6.1.0
++ _ZNK21PipeWireEncodedStream6Packet10isKeyFrameEv@Base 6.1.0
++ _ZNK21PipeWireEncodedStream6Packet4dataEv@Base 6.1.0
++ _ZNK25PipeWireBaseEncodedStream10metaObjectEv@Base 6.1.0
++ _ZNK25PipeWireBaseEncodedStream12maxFramerateEv@Base 6.1.0
++ _ZNK25PipeWireBaseEncodedStream13maxBufferSizeEv@Base 6.1.0
++ _ZNK25PipeWireBaseEncodedStream17suggestedEncodersEv@Base 6.1.0
++ _ZNK25PipeWireBaseEncodedStream2fdEv@Base 6.1.0
++ _ZNK25PipeWireBaseEncodedStream5stateEv@Base 6.1.0
++ _ZNK25PipeWireBaseEncodedStream6nodeIdEv@Base 6.1.0
++ _ZNK25PipeWireBaseEncodedStream7encoderEv@Base 6.1.0
++ _ZNK25PipeWireBaseEncodedStream7qualityEv@Base 6.1.0
++ _ZNK25PipeWireBaseEncodedStream8isActiveEv@Base 6.1.0
++ _ZTI14PipeWireRecord@Base 6.1.0
++ _ZTI21PipeWireEncodedStream@Base 6.1.0
++ _ZTI25PipeWireBaseEncodedStream@Base 6.1.0
++ (arch=armel riscv64)_ZTIN9__gnu_cxx7__mutexE@Base 6.1.0
++ (arch=armel riscv64)_ZTISt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=amd64 armhf)_ZTISt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ (arch=armel riscv64)_ZTISt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=amd64 armhf)_ZTISt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ (arch=armel armhf)_ZTISt19_Sp_make_shared_tag@Base 6.1.0
++ _ZTS14PipeWireRecord@Base 6.1.0
++ _ZTS21PipeWireEncodedStream@Base 6.1.0
++ _ZTS25PipeWireBaseEncodedStream@Base 6.1.0
++ (arch=armel riscv64)_ZTSN9__gnu_cxx7__mutexE@Base 6.1.0
++ (arch=armel riscv64)_ZTSSt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=amd64 armhf)_ZTSSt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ (arch=armel riscv64)_ZTSSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE1EE@Base 6.1.0
++ (arch=amd64 armhf)_ZTSSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE@Base 6.1.0
++ _ZTSSt19_Sp_make_shared_tag@Base 6.1.0
++ _ZTV14PipeWireRecord@Base 6.1.0
++ _ZTV21PipeWireEncodedStream@Base 6.1.0
++ _ZTV25PipeWireBaseEncodedStream@Base 6.1.0
++ _ZZNSt19_Sp_make_shared_tag5_S_tiEvE5__tag@Base 6.1.0
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..cdec66f720be34470c7a4a5eb7134958014e23d2
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,9 @@@
++upstream_686df1e3_Tweak-compiler-warning-flags-to-reduce-unneeded-output.patch
++upstream_52911b70_Change-Encoder-applyEncodingPreference-to-buildEncodingOptions-.patch
++upstream_c928ed5c_Add-logging-of-encoding-options-if-log-level-is-set-to-info.patch
++upstream_f127a2cc_Set-threads-option-by-default-in-Encoder.patch
++upstream_5a223fe4_Port-Encoder-away-from-deprecated-avcodec-close.patch
++upstream_123ae0d2_Tweak-encoding-options-for-VP9.patch
++upstream_0ac4aa41_encodedstream-Deprecate-setActive-and-replace-with-an-explicit-API.patch
++upstream_8793ae86_encodedstream-Don-t-query-VAAPI-in-the-constructor.patch
++upstream_9fe7a568_Adjust-timers-from-the-correct-thread.patch
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..34c791b1c08afbf146a1a2e3200eac77788fbdbe
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,350 @@@
++From 0ac4aa418b6a7665f3d9e811c7f6632687651e6b Mon Sep 17 00:00:00 2001
++From: Arjen Hiemstra <ahiemstra@heimr.nl>
++Date: Tue, 8 Oct 2024 14:03:20 +0200
++Subject: [PATCH] encodedstream: Deprecate setActive() and replace with an
++ explicit API
++
++setActive() currently implies starting/stopping the recording process.
++However, this is somewhat awkward as everything is rather asynchronous
++with multiple threads involved, which means calling setActive() may mean
++things are not actually active or may still be active.
++
++To avoid this awkwardness, deprecate setActive() and replace it with an
++explicit start() and stop() method that are clearly documented to be
++purely requests, with the real active/inactive state matching the stream
++state.
++
++This also makes the "Rendering" state more explicit, when "Stop" is
++called we immediately switch to the "Rendering" state to indicate we may
++still be processing frames but are no longer receiving new frames.
++---
++ src/pipewirebaseencodedstream.cpp | 111 +++++++++++++++++++-----------
++ src/pipewirebaseencodedstream.h   |  40 ++++++++++-
++ src/pipewireproduce.cpp           |   2 +
++ src/pipewireproduce_p.h           |   2 +
++ src/pipewirerecord.cpp            |   1 -
++ tests/HeadlessTest.cpp            |  20 ++++--
++ 6 files changed, 127 insertions(+), 49 deletions(-)
++
++--- a/src/pipewirebaseencodedstream.cpp
+++++ b/src/pipewirebaseencodedstream.cpp
++@@ -17,6 +17,8 @@ extern "C" {
++ }
++ #include <unistd.h>
++ 
+++#include <QThread>
+++
++ #include "pipewireproduce_p.h"
++ #include "vaapiutils_p.h"
++ 
++@@ -29,6 +31,7 @@ struct PipeWireEncodedStreamPrivate {
++     PipeWireBaseEncodedStream::Encoder m_encoder;
++     std::optional<quint8> m_quality;
++     PipeWireBaseEncodedStream::EncodingPreference m_encodingPreference;
+++    PipeWireBaseEncodedStream::State m_state = PipeWireBaseEncodedStream::Idle;
++ 
++     std::unique_ptr<QThread> m_produceThread;
++     std::unique_ptr<PipeWireProduce> m_produce;
++@@ -36,13 +39,7 @@ struct PipeWireEncodedStreamPrivate {
++ 
++ PipeWireBaseEncodedStream::State PipeWireBaseEncodedStream::state() const
++ {
++-    if (isActive()) {
++-        return Recording;
++-    } else if (d->m_produceThread && d->m_produce->m_deactivated && d->m_produceThread->isRunning()) {
++-        return Rendering;
++-    }
++-
++-    return Idle;
+++    return d->m_state;
++ }
++ 
++ PipeWireBaseEncodedStream::PipeWireBaseEncodedStream(QObject *parent)
++@@ -65,10 +62,10 @@ PipeWireBaseEncodedStream::PipeWireBaseE
++ 
++ PipeWireBaseEncodedStream::~PipeWireBaseEncodedStream()
++ {
++-    setActive(false);
+++    stop();
++ 
++-    if (d->m_fd) {
++-        close(*d->m_fd);
+++    if (d->m_produceThread) {
+++        d->m_produceThread->wait();
++     }
++ }
++ 
++@@ -78,7 +75,6 @@ void PipeWireBaseEncodedStream::setNodeI
++         return;
++ 
++     d->m_nodeId = nodeId;
++-    refresh();
++     Q_EMIT nodeIdChanged(nodeId);
++ }
++ 
++@@ -91,7 +87,6 @@ void PipeWireBaseEncodedStream::setFd(ui
++         close(*d->m_fd);
++     }
++     d->m_fd = fd;
++-    refresh();
++     Q_EMIT fdChanged(fd);
++ }
++ 
++@@ -141,50 +136,84 @@ int PipeWireBaseEncodedStream::maxBuffer
++ 
++ void PipeWireBaseEncodedStream::setActive(bool active)
++ {
++-    if (d->m_active == active)
++-        return;
+++    if (active) {
+++        start();
+++    } else {
+++        stop();
++ 
++-    d->m_active = active;
++-    refresh();
++-    Q_EMIT activeChanged(active);
+++        if (d->m_produceThread) {
+++            d->m_produceThread->wait();
+++        }
+++    }
++ }
++ 
++-std::optional<quint8> PipeWireBaseEncodedStream::quality() const
+++void PipeWireBaseEncodedStream::start()
++ {
++-    return d->m_quality;
++-}
+++    if (d->m_nodeId == 0) {
+++        qCWarning(PIPEWIRERECORD_LOGGING) << "Cannot start recording on a stream without a node ID";
+++        return;
+++    }
++ 
++-void PipeWireBaseEncodedStream::setQuality(quint8 quality)
++-{
++-    d->m_quality = quality;
++-    if (d->m_produce) {
++-        d->m_produce->setQuality(d->m_quality);
+++    if (d->m_produceThread || d->m_state != Idle) {
+++        return;
++     }
+++
+++    d->m_produceThread = std::make_unique<QThread>();
+++    d->m_produceThread->setObjectName("PipeWireProduce::input");
+++    d->m_produce = makeProduce();
+++    d->m_produce->setQuality(d->m_quality);
+++    d->m_produce->setMaxPendingFrames(d->m_maxPendingFrames);
+++    d->m_produce->setEncodingPreference(d->m_encodingPreference);
+++    d->m_produce->moveToThread(d->m_produceThread.get());
+++    d->m_produceThread->start();
+++    QMetaObject::invokeMethod(d->m_produce.get(), &PipeWireProduce::initialize, Qt::QueuedConnection);
+++
+++    connect(d->m_produce.get(), &PipeWireProduce::started, this, [this]() {
+++        d->m_active = true;
+++        Q_EMIT activeChanged(true);
+++        d->m_state = Recording;
+++        Q_EMIT stateChanged();
+++    });
+++
+++    connect(d->m_produce.get(), &PipeWireProduce::finished, this, [this]() {
+++        d->m_active = false;
+++        Q_EMIT activeChanged(false);
+++        d->m_state = Idle;
+++        Q_EMIT stateChanged();
+++    });
+++
+++    connect(d->m_produceThread.get(), &QThread::finished, this, [this]() {
+++        d->m_produce.reset();
+++        d->m_produceThread.reset();
+++        d->m_nodeId = 0;
+++
+++        if (d->m_fd) {
+++            close(d->m_fd.value());
+++        }
+++    });
++ }
++ 
++-void PipeWireBaseEncodedStream::refresh()
+++void PipeWireBaseEncodedStream::stop()
++ {
++     if (d->m_produceThread) {
++         QMetaObject::invokeMethod(d->m_produce.get(), &PipeWireProduce::deactivate, Qt::QueuedConnection);
++-        d->m_produceThread->wait();
++-
++-        d->m_produce.reset();
++-        d->m_produceThread.reset();
++     }
++ 
++-    if (d->m_active && d->m_nodeId > 0) {
++-        d->m_produceThread = std::make_unique<QThread>();
++-        d->m_produceThread->setObjectName("PipeWireProduce::input");
++-        d->m_produce = makeProduce();
+++    d->m_state = PipeWireBaseEncodedStream::Rendering;
+++    Q_EMIT stateChanged();
+++}
+++
+++std::optional<quint8> PipeWireBaseEncodedStream::quality() const
+++{
+++    return d->m_quality;
+++}
+++
+++void PipeWireBaseEncodedStream::setQuality(quint8 quality)
+++{
+++    d->m_quality = quality;
+++    if (d->m_produce) {
++         d->m_produce->setQuality(d->m_quality);
++-        d->m_produce->setMaxPendingFrames(d->m_maxPendingFrames);
++-        d->m_produce->setEncodingPreference(d->m_encodingPreference);
++-        d->m_produce->moveToThread(d->m_produceThread.get());
++-        d->m_produceThread->start();
++-        QMetaObject::invokeMethod(d->m_produce.get(), &PipeWireProduce::initialize, Qt::QueuedConnection);
++     }
++-
++-    Q_EMIT stateChanged();
++ }
++ 
++ void PipeWireBaseEncodedStream::setEncoder(Encoder encoder)
++--- a/src/pipewirebaseencodedstream.h
+++++ b/src/pipewirebaseencodedstream.h
++@@ -25,7 +25,7 @@ class KPIPEWIRE_EXPORT PipeWireBaseEncod
++      * Transfers the ownership of the fd, will close it when it's done with it.
++      */
++     Q_PROPERTY(uint fd READ fd WRITE setFd NOTIFY fdChanged)
++-    Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged)
+++    Q_PROPERTY(bool active READ isActive NOTIFY activeChanged)
++     Q_PROPERTY(State state READ state NOTIFY stateChanged)
++     Q_PROPERTY(Encoder encoder READ encoder WRITE setEncoder NOTIFY encoderChanged)
++ 
++@@ -67,7 +67,42 @@ public:
++     int maxBufferSize() const;
++ 
++     bool isActive() const;
++-    void setActive(bool active);
+++    /**
+++     * Set the active state of recording.
+++     *
+++     * @deprecated Since 6.4, use the separate `start()`/`stop()`calls instead.
+++     * This function now just calls `start()`/`stop()`.
+++     *
+++     * @note When calling `setActive(false)`, unlike `stop()`, this function will
+++     * block until the internal encoding threads are finished.
+++     */
+++    KPIPEWIRE_DEPRECATED void setActive(bool active);
+++
+++    /**
+++     * Request to start recording.
+++     *
+++     * This will create everything required to perform recording, like a PipeWire
+++     * stream and an encoder, then start receiving frames from the stream and
+++     * encoding those.
+++     *
+++     * This requires a valid node ID to be set and that the current state is Idle.
+++     *
+++     * Note that recording all happens on separate threads, this method only
+++     * starts the process, only when state() returns Recording is recording
+++     * actually happening.
+++     */
+++    Q_INVOKABLE void start();
+++    /**
+++     * Request to stop recording.
+++     *
+++     * This will terminate receiving frames from PipeWire and do any cleanup
+++     * necessary to fully terminate recording after that.
+++     *
+++     * Note that after this request, there may still be some processing required
+++     * due to internal queues. As long as state() does not return Idle processing
+++     * is still happening and teardown has not been completed.
+++     */
+++    Q_INVOKABLE void stop();
++ 
++     /**
++      * The quality used for encoding.
++@@ -127,6 +162,5 @@ protected:
++     virtual std::unique_ptr<PipeWireProduce> makeProduce() = 0;
++     EncodingPreference encodingPreference();
++ 
++-    void refresh();
++     QScopedPointer<PipeWireEncodedStreamPrivate> d;
++ };
++--- a/src/pipewireproduce.cpp
+++++ b/src/pipewireproduce.cpp
++@@ -183,6 +183,7 @@ void PipeWireProduce::setupStream()
++         }
++     });
++     pthread_setname_np(m_outputThread.native_handle(), "PipeWireProduce::output");
+++    Q_EMIT started();
++ }
++ 
++ void PipeWireProduce::deactivate()
++@@ -231,6 +232,7 @@ void PipeWireProduce::destroy()
++ 
++     qCDebug(PIPEWIRERECORD_LOGGING) << "finished";
++     cleanup();
+++    Q_EMIT finished();
++     QThread::currentThread()->quit();
++ }
++ 
++--- a/src/pipewireproduce_p.h
+++++ b/src/pipewireproduce_p.h
++@@ -151,6 +151,8 @@ public:
++ 
++ Q_SIGNALS:
++     void producedFrames();
+++    void started();
+++    void finished();
++ 
++ private:
++     void initFiltersVaapi();
++--- a/src/pipewirerecord.cpp
+++++ b/src/pipewirerecord.cpp
++@@ -69,7 +69,6 @@ void PipeWireRecord::setOutput(const QSt
++         return;
++ 
++     d->m_output = output;
++-    refresh();
++     Q_EMIT outputChanged(output);
++ }
++ 
++--- a/tests/HeadlessTest.cpp
+++++ b/tests/HeadlessTest.cpp
++@@ -55,16 +55,29 @@ void createStream(int nodeId, std::optio
++             }
++             encoded->setEncoder(enc);
++         }
++-        encoded->setActive(true);
+++        encoded->start();
++         QObject::connect(encoded, &PipeWireEncodedStream::newPacket, qGuiApp, [](const PipeWireEncodedStream::Packet &packet) {
++             qDebug() << "packet received" << packet.data().size() << "key:" << packet.isKeyFrame();
++         });
++         QObject::connect(encoded, &PipeWireEncodedStream::cursorChanged, qGuiApp, [](const PipeWireCursor &cursor) {
++             qDebug() << "cursor received. position:" << cursor.position << "hotspot:" << cursor.hotspot << "image:" << cursor.texture;
++         });
+++        QObject::connect(encoded, &PipeWireEncodedStream::stateChanged, qGuiApp, [encoded]() {
+++            switch (encoded->state()) {
+++            case PipeWireEncodedStream::Recording:
+++                qDebug() << "Started recording";
+++                break;
+++            case PipeWireEncodedStream::Rendering:
+++                qDebug() << "Stopped recording, flushing remaining frames";
+++                break;
+++            case PipeWireEncodedStream::Idle:
+++                qDebug() << "Recording finished, quitting";
+++                exit(0);
+++                break;
+++            }
+++        });
++         QObject::connect(KSignalHandler::self(), &KSignalHandler::signalReceived, encoded, [encoded] {
++-            encoded->setActive(false);
++-            exit(0);
+++            encoded->stop();
++         });
++         return;
++     }
++@@ -96,7 +109,6 @@ void createStream(int nodeId, std::optio
++     });
++     QObject::connect(KSignalHandler::self(), &KSignalHandler::signalReceived, pwStream, [pwStream] {
++         pwStream->setActive(false);
++-        exit(0);
++     });
++ }
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..81be9d9c9872eef8faab0598766a3bb3531b67ef
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,58 @@@
++From 123ae0d2e77758583301e91e9d2b94cec124376e Mon Sep 17 00:00:00 2001
++From: Arjen Hiemstra <ahiemstra@heimr.nl>
++Date: Thu, 20 Mar 2025 14:31:24 +0100
++Subject: [PATCH] Tweak encoding options for VP9
++
++Don't set both bitrate and CRF, as they are conflicting settings.
++Instead only set CRF. Also enable row-mt and avoid modifying the codec
++context in a function that is about options.
++---
++ src/libvpxvp9encoder.cpp | 18 ++++--------------
++ 1 file changed, 4 insertions(+), 14 deletions(-)
++
++diff --git a/src/libvpxvp9encoder.cpp b/src/libvpxvp9encoder.cpp
++index d877023..a9220f4 100644
++--- a/src/libvpxvp9encoder.cpp
+++++ b/src/libvpxvp9encoder.cpp
++@@ -60,16 +60,6 @@ bool LibVpxVp9Encoder::initialize(const QSize &size)
++ 
++     m_avCodecContext->gop_size = fps * 2;
++ 
++-    // TODO: Make bitrate depend on the framerate? More frames is more data.
++-    // maxFramerate can apparently be changed while recording, so keep that in mind.
++-    m_avCodecContext->bit_rate = std::round(area * 2);
++-    m_avCodecContext->rc_min_rate = std::round(area);
++-    m_avCodecContext->rc_max_rate = std::round(area * 3);
++-
++-    m_avCodecContext->rc_buffer_size = m_avCodecContext->bit_rate;
++-
++-    m_avCodecContext->thread_count = QThread::idealThreadCount();
++-
++     if (int result = avcodec_open2(m_avCodecContext, codec, &options); result < 0) {
++         qCWarning(PIPEWIRERECORD_LOGGING) << "Could not open codec" << av_err2str(result);
++         return false;
++@@ -100,8 +90,9 @@ AVDictionary *LibVpxVp9Encoder::buildEncodingOptions()
++     if (m_quality) {
++         crf = percentageToAbsoluteQuality(m_quality);
++     }
++-    m_avCodecContext->qmin = std::clamp(crf / 2, 0, crf);
++-    m_avCodecContext->qmax = std::clamp(qRound(crf * 1.5), crf, 63);
+++
+++    av_dict_set_int(&options, "qmin", std::clamp(crf / 2, 0, crf), 0);
+++    av_dict_set_int(&options, "qmax", std::clamp(int(crf * 1.5), crf, 63), 0);
++     av_dict_set_int(&options, "crf", crf, 0);
++ 
++     // 0-4 are for Video-On-Demand with the good or best deadline.
++@@ -117,8 +108,7 @@ AVDictionary *LibVpxVp9Encoder::buildEncodingOptions()
++     av_dict_set(&options, "tile-columns", "6", 0);
++     av_dict_set(&options, "tile-rows", "2", 0);
++ 
++-    // This should make things faster, but it only seems to consume 100MB more RAM.
++-    // av_dict_set(&options, "row-mt", "1", 0);
+++    av_dict_set(&options, "row-mt", "1", 0);
++     av_dict_set(&options, "frame-parallel", "1", 0);
++ 
++     return options;
++-- 
++GitLab
++
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..58c5d597b17724dec9597aa3ca5582f4c36aaf23
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,351 @@@
++From 52911b7060fc3341c4ab4b308be1e47f985e8576 Mon Sep 17 00:00:00 2001
++From: Arjen Hiemstra <ahiemstra@heimr.nl>
++Date: Thu, 20 Mar 2025 14:26:36 +0100
++Subject: [PATCH] Change Encoder::applyEncodingPreference() to
++ buildEncodingOptions()
++
++As it turns out, FFmpeg does something to the pointers here that causes
++the dictionary to never be properly used. This means we were never
++applying the encoding options, as avcodec_open() was passed a nullptr
++for options.
++
++Fix this by changing the function to return an AVDictionary* instead of
++trying to modify a passed-in pointer. This results in a proper dict
++being returned, that can then be passed to avcodec_open().
++
++The main result of this is that we now properly apply the encoding
++options for VP9 encoding, which means we can now encode VP9 at realtime
++speeds instead of it massively lagging behind.
++
++BUG: 488896
++---
++ src/encoder.cpp            |  6 +++++-
++ src/encoder_p.h            |  2 +-
++ src/gifencoder.cpp         |  7 -------
++ src/gifencoder_p.h         |  1 -
++ src/h264vaapiencoder.cpp   | 10 +++++-----
++ src/h264vaapiencoder_p.h   |  2 +-
++ src/libopenh264encoder.cpp | 10 +++++-----
++ src/libopenh264encoder_p.h |  2 +-
++ src/libvpxencoder.cpp      | 10 ++++++----
++ src/libvpxencoder_p.h      |  2 +-
++ src/libvpxvp9encoder.cpp   | 10 ++++++----
++ src/libvpxvp9encoder_p.h   |  2 +-
++ src/libwebpencoder_p.h     |  1 -
++ src/libx264encoder.cpp     | 11 ++++++-----
++ src/libx264encoder_p.h     |  2 +-
++ 15 files changed, 39 insertions(+), 39 deletions(-)
++
++diff --git a/src/encoder.cpp b/src/encoder.cpp
++index 41e6ac58..33617850 100644
++--- a/src/encoder.cpp
+++++ b/src/encoder.cpp
++@@ -185,8 +185,10 @@ void Encoder::setEncodingPreference(PipeWireBaseEncodedStream::EncodingPreferenc
++     m_encodingPreference = preference;
++ }
++ 
++-void Encoder::applyEncodingPreference(AVDictionary *options)
+++AVDictionary *Encoder::buildEncodingOptions()
++ {
+++    AVDictionary *options = NULL;
+++
++     switch (m_encodingPreference) {
++     case PipeWireBaseEncodedStream::EncodingPreference::NoPreference:
++         av_dict_set(&options, "preset", "veryfast", 0);
++@@ -205,6 +207,8 @@ void Encoder::applyEncodingPreference(AVDictionary *options)
++         av_dict_set(&options, "preset", "veryfast", 0);
++         break;
++     }
+++
+++    return options;
++ }
++ 
++ SoftwareEncoder::SoftwareEncoder(PipeWireProduce *produce)
++diff --git a/src/encoder_p.h b/src/encoder_p.h
++index 1acd2548..48d3a9ea 100644
++--- a/src/encoder_p.h
+++++ b/src/encoder_p.h
++@@ -102,6 +102,7 @@ public:
++ 
++ protected:
++     virtual int percentageToAbsoluteQuality(const std::optional<quint8> &quality) = 0;
+++    virtual AVDictionary *buildEncodingOptions();
++ 
++     PipeWireProduce *m_produce;
++ 
++@@ -114,7 +115,6 @@ protected:
++ 
++     std::optional<quint8> m_quality;
++     PipeWireBaseEncodedStream::EncodingPreference m_encodingPreference;
++-    virtual void applyEncodingPreference(AVDictionary *options);
++ };
++ 
++ /**
++diff --git a/src/gifencoder.cpp b/src/gifencoder.cpp
++index 4e24dea4..e2d9802b 100644
++--- a/src/gifencoder.cpp
+++++ b/src/gifencoder.cpp
++@@ -54,9 +54,6 @@ bool GifEncoder::initialize(const QSize &size)
++     m_avCodecContext->time_base = AVRational{1, 1000};
++ 
++     AVDictionary *options = nullptr;
++-
++-    applyEncodingPreference(options);
++-
++     if (int result = avcodec_open2(m_avCodecContext, codec, &options); result < 0) {
++         qCWarning(PIPEWIRERECORD_LOGGING) << "Could not open codec" << av_err2str(result);
++         return false;
++@@ -79,7 +76,3 @@ int GifEncoder::percentageToAbsoluteQuality([[maybe_unused]] const std::optional
++ {
++     return -1; // Not possible to set quality
++ }
++-
++-void GifEncoder::applyEncodingPreference([[maybe_unused]] AVDictionary *options)
++-{
++-}
++diff --git a/src/gifencoder_p.h b/src/gifencoder_p.h
++index 9eceb0f2..5e2c0568 100644
++--- a/src/gifencoder_p.h
+++++ b/src/gifencoder_p.h
++@@ -18,5 +18,4 @@ public:
++ 
++ protected:
++     int percentageToAbsoluteQuality(const std::optional<quint8> &quality) override;
++-    void applyEncodingPreference(AVDictionary *options) override;
++ };
++diff --git a/src/h264vaapiencoder.cpp b/src/h264vaapiencoder.cpp
++index cf315f3c..26e7fba2 100644
++--- a/src/h264vaapiencoder.cpp
+++++ b/src/h264vaapiencoder.cpp
++@@ -140,9 +140,7 @@ bool H264VAAPIEncoder::initialize(const QSize &size)
++         break;
++     }
++ 
++-    AVDictionary *options = nullptr;
++-    // av_dict_set_int(&options, "threads", qMin(16, QThread::idealThreadCount()), 0);
++-    applyEncodingPreference(options);
+++    AVDictionary *options = buildEncodingOptions();
++ 
++     // Assign the right hardware context for encoding frames.
++     // We rely on FFmpeg for creating the VAAPI hardware context as part of
++@@ -168,11 +166,13 @@ int H264VAAPIEncoder::percentageToAbsoluteQuality(const std::optional<quint8> &q
++     return std::max(1, int(MinQuality - (m_quality.value() / 100.0) * MinQuality));
++ }
++ 
++-void H264VAAPIEncoder::applyEncodingPreference(AVDictionary *options)
+++AVDictionary *H264VAAPIEncoder::buildEncodingOptions()
++ {
++-    HardwareEncoder::applyEncodingPreference(options);
+++    AVDictionary *options = HardwareEncoder::buildEncodingOptions();
++     // Disable motion estimation, not great while dragging windows but speeds up encoding by an order of magnitude
++     av_dict_set(&options, "flags", "+mv4", 0);
++     // Disable in-loop filtering
++     av_dict_set(&options, "-flags", "+loop", 0);
+++
+++    return options;
++ }
++diff --git a/src/h264vaapiencoder_p.h b/src/h264vaapiencoder_p.h
++index 9a226508..3b02b335 100644
++--- a/src/h264vaapiencoder_p.h
+++++ b/src/h264vaapiencoder_p.h
++@@ -20,7 +20,7 @@ public:
++ 
++ protected:
++     int percentageToAbsoluteQuality(const std::optional<quint8> &quality) override;
++-    void applyEncodingPreference(AVDictionary *options) override;
+++    AVDictionary *buildEncodingOptions() override;
++ 
++ private:
++     H264Profile m_profile = H264Profile::Main;
++diff --git a/src/libopenh264encoder.cpp b/src/libopenh264encoder.cpp
++index 6d4c6a18..7f374d25 100644
++--- a/src/libopenh264encoder.cpp
+++++ b/src/libopenh264encoder.cpp
++@@ -74,9 +74,7 @@ bool LibOpenH264Encoder::initialize(const QSize &size)
++         break;
++     }
++ 
++-    AVDictionary *options = nullptr;
++-    av_dict_set_int(&options, "threads", qMin(16, QThread::idealThreadCount()), 0);
++-    applyEncodingPreference(options);
+++    AVDictionary *options = buildEncodingOptions();
++ 
++     if (int result = avcodec_open2(m_avCodecContext, codec, &options); result < 0) {
++         qCWarning(PIPEWIRERECORD_LOGGING) << "Could not open codec" << av_err2str(result);
++@@ -96,11 +94,13 @@ int LibOpenH264Encoder::percentageToAbsoluteQuality(const std::optional<quint8>
++     return 51 - (m_quality.value() / 100.0) * 50;
++ }
++ 
++-void LibOpenH264Encoder::applyEncodingPreference(AVDictionary *options)
+++AVDictionary *LibOpenH264Encoder::buildEncodingOptions()
++ {
++-    SoftwareEncoder::applyEncodingPreference(options);
+++    AVDictionary *options = SoftwareEncoder::buildEncodingOptions();
++     // Disable motion estimation, not great while dragging windows but speeds up encoding by an order of magnitude
++     av_dict_set(&options, "flags", "+mv4", 0);
++     // Disable in-loop filtering
++     av_dict_set_int(&options, "loopfilter", 0, 0);
+++
+++    return options;
++ }
++diff --git a/src/libopenh264encoder_p.h b/src/libopenh264encoder_p.h
++index fdacf147..64fb8848 100644
++--- a/src/libopenh264encoder_p.h
+++++ b/src/libopenh264encoder_p.h
++@@ -21,7 +21,7 @@ public:
++ 
++ protected:
++     int percentageToAbsoluteQuality(const std::optional<quint8> &quality) override;
++-    void applyEncodingPreference(AVDictionary *options) override;
+++    AVDictionary *buildEncodingOptions() override;
++ 
++ private:
++     H264Profile m_profile = H264Profile::Main;
++diff --git a/src/libvpxencoder.cpp b/src/libvpxencoder.cpp
++index d0cc9ea7..2d696d6e 100644
++--- a/src/libvpxencoder.cpp
+++++ b/src/libvpxencoder.cpp
++@@ -57,8 +57,7 @@ bool LibVpxEncoder::initialize(const QSize &size)
++         m_avCodecContext->global_quality = 35;
++     }
++ 
++-    AVDictionary *options = nullptr;
++-    applyEncodingPreference(options);
+++    AVDictionary *options = buildEncodingOptions();
++ 
++     if (int result = avcodec_open2(m_avCodecContext, codec, &options); result < 0) {
++         qCWarning(PIPEWIRERECORD_LOGGING) << "Could not open codec" << av_err2str(result);
++@@ -78,9 +77,10 @@ int LibVpxEncoder::percentageToAbsoluteQuality(const std::optional<quint8> &qual
++     return std::max(1, int(MinQuality - (m_quality.value() / 100.0) * MinQuality));
++ }
++ 
++-void LibVpxEncoder::applyEncodingPreference(AVDictionary *options)
+++AVDictionary *LibVpxEncoder::buildEncodingOptions()
++ {
++-    av_dict_set_int(&options, "threads", qMin(16, QThread::idealThreadCount()), 0);
+++    AVDictionary *options = SoftwareEncoder::buildEncodingOptions();
+++
++     av_dict_set(&options, "preset", "veryfast", 0);
++     av_dict_set(&options, "tune-content", "screen", 0);
++     av_dict_set(&options, "deadline", "realtime", 0);
++@@ -91,4 +91,6 @@ void LibVpxEncoder::applyEncodingPreference(AVDictionary *options)
++     // Disable in-loop filtering
++     av_dict_set(&options, "-flags", "+loop", 0);
++     av_dict_set(&options, "crf", "45", 0);
+++
+++    return options;
++ }
++diff --git a/src/libvpxencoder_p.h b/src/libvpxencoder_p.h
++index 22fcae87..419117ae 100644
++--- a/src/libvpxencoder_p.h
+++++ b/src/libvpxencoder_p.h
++@@ -20,5 +20,5 @@ public:
++ 
++ protected:
++     int percentageToAbsoluteQuality(const std::optional<quint8> &quality) override;
++-    void applyEncodingPreference(AVDictionary *options) override;
+++    AVDictionary *buildEncodingOptions() override;
++ };
++diff --git a/src/libvpxvp9encoder.cpp b/src/libvpxvp9encoder.cpp
++index d3ce94b0..0b630155 100644
++--- a/src/libvpxvp9encoder.cpp
+++++ b/src/libvpxvp9encoder.cpp
++@@ -50,9 +50,7 @@ bool LibVpxVp9Encoder::initialize(const QSize &size)
++     m_avCodecContext->pix_fmt = AV_PIX_FMT_YUV420P;
++     m_avCodecContext->time_base = AVRational{1, 1000};
++ 
++-    AVDictionary *options = nullptr;
++-
++-    applyEncodingPreference(options);
+++    AVDictionary *options = buildEncodingOptions();
++ 
++     const auto area = size.width() * size.height();
++     // m_avCodecContext->framerate is not set, so we use m_produce->maxFramerate() instead.
++@@ -89,8 +87,10 @@ int LibVpxVp9Encoder::percentageToAbsoluteQuality(const std::optional<quint8> &q
++     return std::max(1, int(MinQuality - (m_quality.value() / 100.0) * MinQuality));
++ }
++ 
++-void LibVpxVp9Encoder::applyEncodingPreference(AVDictionary *options)
+++AVDictionary *LibVpxVp9Encoder::buildEncodingOptions()
++ {
+++    AVDictionary *options = SoftwareEncoder::buildEncodingOptions();
+++
++     // We're probably capturing a screen
++     av_dict_set(&options, "tune-content", "screen", 0);
++ 
++@@ -119,4 +119,6 @@ void LibVpxVp9Encoder::applyEncodingPreference(AVDictionary *options)
++     // This should make things faster, but it only seems to consume 100MB more RAM.
++     // av_dict_set(&options, "row-mt", "1", 0);
++     av_dict_set(&options, "frame-parallel", "1", 0);
+++
+++    return options;
++ }
++diff --git a/src/libvpxvp9encoder_p.h b/src/libvpxvp9encoder_p.h
++index c2008273..863fda2d 100644
++--- a/src/libvpxvp9encoder_p.h
+++++ b/src/libvpxvp9encoder_p.h
++@@ -21,5 +21,5 @@ public:
++ 
++ protected:
++     int percentageToAbsoluteQuality(const std::optional<quint8> &quality) override;
++-    void applyEncodingPreference(AVDictionary *options) override;
+++    AVDictionary *buildEncodingOptions() override;
++ };
++diff --git a/src/libwebpencoder_p.h b/src/libwebpencoder_p.h
++index a6d5782a..e4bfd125 100644
++--- a/src/libwebpencoder_p.h
+++++ b/src/libwebpencoder_p.h
++@@ -17,5 +17,4 @@ public:
++ 
++ protected:
++     int percentageToAbsoluteQuality(const std::optional<quint8> &quality) override;
++-    void applyEncodingPreference(AVDictionary *options) override;
++ };
++diff --git a/src/libx264encoder.cpp b/src/libx264encoder.cpp
++index 91011645..7d4f96b2 100644
++--- a/src/libx264encoder.cpp
+++++ b/src/libx264encoder.cpp
++@@ -78,9 +78,7 @@ bool LibX264Encoder::initialize(const QSize &size)
++         break;
++     }
++ 
++-    AVDictionary *options = nullptr;
++-    av_dict_set_int(&options, "threads", qMin(16, QThread::idealThreadCount()), 0);
++-    applyEncodingPreference(options);
+++    AVDictionary *options = buildEncodingOptions();
++ 
++     if (int result = avcodec_open2(m_avCodecContext, codec, &options); result < 0) {
++         qCWarning(PIPEWIRERECORD_LOGGING) << "Could not open codec" << av_err2str(result);
++@@ -100,11 +98,14 @@ int LibX264Encoder::percentageToAbsoluteQuality(const std::optional<quint8> &qua
++     return std::max(1, int(MinQuality - (m_quality.value() / 100.0) * MinQuality));
++ }
++ 
++-void LibX264Encoder::applyEncodingPreference(AVDictionary *options)
+++AVDictionary *LibX264Encoder::buildEncodingOptions()
++ {
++-    SoftwareEncoder::applyEncodingPreference(options);
+++    AVDictionary *options = SoftwareEncoder::buildEncodingOptions();
+++
++     // Disable motion estimation, not great while dragging windows but speeds up encoding by an order of magnitude
++     av_dict_set(&options, "flags", "+mv4", 0);
++     // Disable in-loop filtering
++     av_dict_set(&options, "-flags", "+loop", 0);
+++
+++    return options;
++ }
++diff --git a/src/libx264encoder_p.h b/src/libx264encoder_p.h
++index c8b877c9..0a800758 100644
++--- a/src/libx264encoder_p.h
+++++ b/src/libx264encoder_p.h
++@@ -20,7 +20,7 @@ public:
++ 
++ protected:
++     int percentageToAbsoluteQuality(const std::optional<quint8> &quality) override;
++-    void applyEncodingPreference(AVDictionary *options) override;
+++    AVDictionary *buildEncodingOptions() override;
++ 
++ private:
++     H264Profile m_profile = H264Profile::Main;
++-- 
++GitLab
++
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a806a65c876179a053e7a4b83ce6d23de0c891f4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,26 @@@
++From 5a223fe4e1489574fba28dcf65c8a4aa1387e0e0 Mon Sep 17 00:00:00 2001
++From: Arjen Hiemstra <ahiemstra@heimr.nl>
++Date: Thu, 20 Mar 2025 14:28:54 +0100
++Subject: [PATCH] Port Encoder away from deprecated avcodec_close
++
++---
++ src/encoder.cpp | 3 +--
++ 1 file changed, 1 insertion(+), 2 deletions(-)
++
++diff --git a/src/encoder.cpp b/src/encoder.cpp
++index 874ac08..7aa1738 100644
++--- a/src/encoder.cpp
+++++ b/src/encoder.cpp
++@@ -73,8 +73,7 @@ Encoder::~Encoder()
++     }
++ 
++     if (m_avCodecContext) {
++-        avcodec_close(m_avCodecContext);
++-        av_free(m_avCodecContext);
+++        avcodec_free_context(&m_avCodecContext);
++     }
++ }
++ 
++-- 
++GitLab
++
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2cf484f03af085b49c467b19b5db1eeb0255c1b7
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,47 @@@
++From 686df1e3fb6a740281413ae0633003f8ffabcf6b Mon Sep 17 00:00:00 2001
++From: Arjen Hiemstra <ahiemstra@heimr.nl>
++Date: Thu, 20 Mar 2025 14:19:21 +0100
++Subject: [PATCH] Tweak compiler warning flags to reduce unneeded output
++
++-Wno-gnu-statement-expression-from-macro-expansion and
++-Wno-c99-extensions are non-existent options that add more noise than
++they fix. Additionally, -Wpedantic is enabled by default which causes a
++lot of noise, so disable that. Finally, add
++-Wno-missing-field-initializers to quiet down the final bits of PipeWire
++API.
++---
++ src/CMakeLists.txt     | 2 +-
++ src/libwebpencoder.cpp | 7 -------
++ 2 files changed, 1 insertion(+), 8 deletions(-)
++
++--- a/src/CMakeLists.txt
+++++ b/src/CMakeLists.txt
++@@ -66,7 +66,7 @@ target_sources(KPipeWire PRIVATE
++ )
++ 
++ # these are features pipewire use extensively and make it hard to look at compile logs
++-target_compile_options(KPipeWire PUBLIC -Wno-gnu-statement-expression-from-macro-expansion -Wno-zero-as-null-pointer-constant -Wno-c99-extensions -Wno-cast-align)
+++target_compile_options(KPipeWire PUBLIC -Wno-zero-as-null-pointer-constant -Wno-missing-field-initializers -Wno-cast-align -Wno-pedantic)
++ 
++ target_link_libraries(KPipeWire PRIVATE Qt::Quick Qt::GuiPrivate KF6::I18n
++     KF6::CoreAddons PkgConfig::PipeWire epoxy::epoxy PkgConfig::GBM Libdrm::Libdrm PkgConfig::LIBVA PkgConfig::LIBVA-drm)
++--- a/src/libwebpencoder.cpp
+++++ b/src/libwebpencoder.cpp
++@@ -51,9 +51,6 @@ bool LibWebPEncoder::initialize(const QS
++     m_avCodecContext->time_base = AVRational{1, 1000};
++ 
++     AVDictionary *options = nullptr;
++-
++-    applyEncodingPreference(options);
++-
++     if (int result = avcodec_open2(m_avCodecContext, codec, &options); result < 0) {
++         qCWarning(PIPEWIRERECORD_LOGGING) << "Could not open codec" << av_err2str(result);
++         return false;
++@@ -66,7 +63,3 @@ int LibWebPEncoder::percentageToAbsolute
++ {
++     return quality.value_or(-1); // Already 0-100. -1 resets to default.
++ }
++-
++-void LibWebPEncoder::applyEncodingPreference([[maybe_unused]] AVDictionary *options)
++-{
++-}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5b55e78b72dd0059a181f1578bb00e191eae3456
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,49 @@@
++From 8793ae866692dcc26faa4271e1dd3588a97d14aa Mon Sep 17 00:00:00 2001
++From: Arjen Hiemstra <ahiemstra@heimr.nl>
++Date: Tue, 8 Oct 2024 14:20:55 +0200
++Subject: [PATCH] encodedstream: Don't query VAAPI in the constructor
++
++Querying VAAPI is expensive, so we should only do that when necessary.
++So rather than querying what encoder to use on construction, query it on
++start and only if we don't already have an encoder set. This also avoids
++duplicate lookups if the user already set the encoder.
++---
++ src/pipewirebaseencodedstream.cpp | 8 +++++---
++ 1 file changed, 5 insertions(+), 3 deletions(-)
++
++diff --git a/src/pipewirebaseencodedstream.cpp b/src/pipewirebaseencodedstream.cpp
++index 27ef198..de51a90 100644
++--- a/src/pipewirebaseencodedstream.cpp
+++++ b/src/pipewirebaseencodedstream.cpp
++@@ -28,7 +28,7 @@ struct PipeWireEncodedStreamPrivate {
++     Fraction m_maxFramerate;
++     int m_maxPendingFrames = 50;
++     bool m_active = false;
++-    PipeWireBaseEncodedStream::Encoder m_encoder;
+++    PipeWireBaseEncodedStream::Encoder m_encoder = PipeWireBaseEncodedStream::NoEncoder;
++     std::optional<quint8> m_quality;
++     PipeWireBaseEncodedStream::EncodingPreference m_encodingPreference;
++     PipeWireBaseEncodedStream::State m_state = PipeWireBaseEncodedStream::Idle;
++@@ -46,8 +46,6 @@ PipeWireBaseEncodedStream::PipeWireBaseEncodedStream(QObject *parent)
++     : QObject(parent)
++     , d(new PipeWireEncodedStreamPrivate)
++ {
++-    d->m_encoder = suggestedEncoders().value(0, NoEncoder);
++-
++     const auto &category = PIPEWIRELIBAV_LOGGING();
++     if (category.isDebugEnabled()) {
++         av_log_set_level(AV_LOG_DEBUG);
++@@ -158,6 +156,10 @@ void PipeWireBaseEncodedStream::start()
++         return;
++     }
++ 
+++    if (d->m_encoder == PipeWireBaseEncodedStream::NoEncoder) {
+++        d->m_encoder = suggestedEncoders().value(0, NoEncoder);
+++    }
+++
++     d->m_produceThread = std::make_unique<QThread>();
++     d->m_produceThread->setObjectName("PipeWireProduce::input");
++     d->m_produce = makeProduce();
++-- 
++GitLab
++
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6892b48ddd5997dde7c66cc371e827ed20cf0b6f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,38 @@@
++From 9fe7a568d1e20bb2d402d49922ae41c0cce8dde7 Mon Sep 17 00:00:00 2001
++From: David Edmundson <kde@davidedmundson.co.uk>
++Date: Thu, 26 Jun 2025 14:50:27 +0100
++Subject: [PATCH] Adjust timers from the correct thread
++
++PipeWireBaseEncodedStream moves the PipeWireProduce into another thread. It is
++therefore it's responsiblity to ensure that any calls into PipeWireProduce are
++run in the correct thread.
++
++This addresses a warning about timers.
++---
++ src/pipewirebaseencodedstream.cpp | 10 +++++++---
++ 1 file changed, 7 insertions(+), 3 deletions(-)
++
++diff --git a/src/pipewirebaseencodedstream.cpp b/src/pipewirebaseencodedstream.cpp
++index de51a90..b17ee1b 100644
++--- a/src/pipewirebaseencodedstream.cpp
+++++ b/src/pipewirebaseencodedstream.cpp
++@@ -103,9 +103,13 @@ void PipeWireBaseEncodedStream::setMaxFramerate(const Fraction &framerate)
++     }
++     d->m_maxFramerate = framerate;
++ 
++-    if (d->m_produce) {
++-        d->m_produce->setMaxFramerate(d->m_maxFramerate);
++-    }
+++    // produce runs in another thread
+++    QMetaObject::invokeMethod(
+++        d->m_produce.get(),
+++        [produce = d->m_produce.get(), framerate]() {
+++            produce->setMaxFramerate(framerate);
+++        },
+++        Qt::QueuedConnection);
++ 
++     Q_EMIT maxFramerateChanged();
++ }
++-- 
++GitLab
++
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5bc7d32f38b9c2697c3a7377a07252e803444f06
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,112 @@@
++From c928ed5ce37f08ead06ab1ae2d74cf1b67a42538 Mon Sep 17 00:00:00 2001
++From: Arjen Hiemstra <ahiemstra@heimr.nl>
++Date: Thu, 20 Mar 2025 14:27:41 +0100
++Subject: [PATCH] Add logging of encoding options if log level is set to info
++
++Allows inspecting what's actually sent to FFmpeg.
++---
++ src/encoder.cpp            | 10 ++++++++++
++ src/encoder_p.h            |  1 +
++ src/h264vaapiencoder.cpp   |  1 +
++ src/libopenh264encoder.cpp |  1 +
++ src/libvpxencoder.cpp      |  1 +
++ src/libvpxvp9encoder.cpp   |  1 +
++ src/libx264encoder.cpp     |  1 +
++ 7 files changed, 16 insertions(+)
++
++diff --git a/src/encoder.cpp b/src/encoder.cpp
++index 3361785..f8b3d67 100644
++--- a/src/encoder.cpp
+++++ b/src/encoder.cpp
++@@ -211,6 +211,16 @@ AVDictionary *Encoder::buildEncodingOptions()
++     return options;
++ }
++ 
+++void Encoder::maybeLogOptions(AVDictionary *options)
+++{
+++    if (PIPEWIRERECORD_LOGGING().isInfoEnabled()) {
+++        char *buffer = NULL;
+++        av_dict_get_string(options, &buffer, '=', ',');
+++        qCInfo(PIPEWIRERECORD_LOGGING) << "Using encoding options:" << buffer;
+++        av_freep(&buffer);
+++    }
+++}
+++
++ SoftwareEncoder::SoftwareEncoder(PipeWireProduce *produce)
++     : Encoder(produce)
++ {
++diff --git a/src/encoder_p.h b/src/encoder_p.h
++index 48d3a9e..e565cc2 100644
++--- a/src/encoder_p.h
+++++ b/src/encoder_p.h
++@@ -103,6 +103,7 @@ public:
++ protected:
++     virtual int percentageToAbsoluteQuality(const std::optional<quint8> &quality) = 0;
++     virtual AVDictionary *buildEncodingOptions();
+++    void maybeLogOptions(AVDictionary *options);
++ 
++     PipeWireProduce *m_produce;
++ 
++diff --git a/src/h264vaapiencoder.cpp b/src/h264vaapiencoder.cpp
++index 26e7fba..0cf251b 100644
++--- a/src/h264vaapiencoder.cpp
+++++ b/src/h264vaapiencoder.cpp
++@@ -141,6 +141,7 @@ bool H264VAAPIEncoder::initialize(const QSize &size)
++     }
++ 
++     AVDictionary *options = buildEncodingOptions();
+++    maybeLogOptions(options);
++ 
++     // Assign the right hardware context for encoding frames.
++     // We rely on FFmpeg for creating the VAAPI hardware context as part of
++diff --git a/src/libopenh264encoder.cpp b/src/libopenh264encoder.cpp
++index 7f374d2..db6ed4d 100644
++--- a/src/libopenh264encoder.cpp
+++++ b/src/libopenh264encoder.cpp
++@@ -75,6 +75,7 @@ bool LibOpenH264Encoder::initialize(const QSize &size)
++     }
++ 
++     AVDictionary *options = buildEncodingOptions();
+++    maybeLogOptions(options);
++ 
++     if (int result = avcodec_open2(m_avCodecContext, codec, &options); result < 0) {
++         qCWarning(PIPEWIRERECORD_LOGGING) << "Could not open codec" << av_err2str(result);
++diff --git a/src/libvpxencoder.cpp b/src/libvpxencoder.cpp
++index 2d696d6..f81b048 100644
++--- a/src/libvpxencoder.cpp
+++++ b/src/libvpxencoder.cpp
++@@ -58,6 +58,7 @@ bool LibVpxEncoder::initialize(const QSize &size)
++     }
++ 
++     AVDictionary *options = buildEncodingOptions();
+++    maybeLogOptions(options);
++ 
++     if (int result = avcodec_open2(m_avCodecContext, codec, &options); result < 0) {
++         qCWarning(PIPEWIRERECORD_LOGGING) << "Could not open codec" << av_err2str(result);
++diff --git a/src/libvpxvp9encoder.cpp b/src/libvpxvp9encoder.cpp
++index 0b63015..d877023 100644
++--- a/src/libvpxvp9encoder.cpp
+++++ b/src/libvpxvp9encoder.cpp
++@@ -51,6 +51,7 @@ bool LibVpxVp9Encoder::initialize(const QSize &size)
++     m_avCodecContext->time_base = AVRational{1, 1000};
++ 
++     AVDictionary *options = buildEncodingOptions();
+++    maybeLogOptions(options);
++ 
++     const auto area = size.width() * size.height();
++     // m_avCodecContext->framerate is not set, so we use m_produce->maxFramerate() instead.
++diff --git a/src/libx264encoder.cpp b/src/libx264encoder.cpp
++index 7d4f96b..d9fe44f 100644
++--- a/src/libx264encoder.cpp
+++++ b/src/libx264encoder.cpp
++@@ -79,6 +79,7 @@ bool LibX264Encoder::initialize(const QSize &size)
++     }
++ 
++     AVDictionary *options = buildEncodingOptions();
+++    maybeLogOptions(options);
++ 
++     if (int result = avcodec_open2(m_avCodecContext, codec, &options); result < 0) {
++         qCWarning(PIPEWIRERECORD_LOGGING) << "Could not open codec" << av_err2str(result);
++-- 
++GitLab
++
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4831c9cdc39d426f957d03f881f63638cc719236
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,26 @@@
++From f127a2cce7f34bfe213754b8756fb96e983f7d0b Mon Sep 17 00:00:00 2001
++From: Arjen Hiemstra <ahiemstra@heimr.nl>
++Date: Thu, 20 Mar 2025 14:28:29 +0100
++Subject: [PATCH] Set "threads" option by default in Encoder
++
++So we don't have to repeat this in other encoders.
++---
++ src/encoder.cpp | 2 ++
++ 1 file changed, 2 insertions(+)
++
++diff --git a/src/encoder.cpp b/src/encoder.cpp
++index f8b3d67..874ac08 100644
++--- a/src/encoder.cpp
+++++ b/src/encoder.cpp
++@@ -189,6 +189,8 @@ AVDictionary *Encoder::buildEncodingOptions()
++ {
++     AVDictionary *options = NULL;
++ 
+++    av_dict_set_int(&options, "threads", qMin(16, QThread::idealThreadCount()), 0);
+++
++     switch (m_encodingPreference) {
++     case PipeWireBaseEncodedStream::EncodingPreference::NoPreference:
++         av_dict_set(&options, "preset", "veryfast", 0);
++-- 
++GitLab
++
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..ec47008452a20fe95d2ef6f71efc5154965873c9
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++usr/lib/*/qt6/qml/org/kde/pipewire/
diff --cc debian/rules
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2a9972d597b76e53f917610da51eeaa055649d8a
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,9 @@@
++#!/usr/bin/make -f
++
++export DEB_BUILD_MAINT_OPTIONS = hardening=+all
++
++%:
++      dh $@
++
++override_dh_auto_configure:
++      dh_auto_configure -- -DBUILD_TESTING=OFF
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..dde1db692f21190abdca71c01863e24089ee2be6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++include:
++- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
++- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
++variables:
++  SALSA_CI_REPROTEST_ARGS: --variations=-build-path
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..96b50ae95f2afe5dab05a615ef4d6b89e544474c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++deb https://qt-kde-team.debian.net/debian qt-kde-snapshots main
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6fc55da9b2d13be83acf27ddea2af8e85de6b8bd
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,51 @@@
++-----BEGIN PGP PUBLIC KEY BLOCK-----
++
++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
++bMTcHe5rk6snXqz1neEmP2K7qdNwwakRdAA=
++=o8PI
++-----END PGP PUBLIC KEY BLOCK-----
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..163aaf8d82b6c54f23c45f32895dbdfdcc27b047
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++3.0 (quilt)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2a9378dcb6caf0d7bc8bca1e35938262c76768a9
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,6 @@@
++Bug-Database: https://bugs.kde.org/buglist.cgi?product=kpipewire&resolution=---
++Changelog: https://kde.org/announcements/
++Donation: https://www.kde.org/community/donations/
++Repository: https://invent.kde.org/plasma/kpipewire.git
++Repository-Browse: https://invent.kde.org/plasma/kpipewire
++Security-Contact: security@kde.org
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7712fc75bfc3f326b84ecfec44f75242898ff4a6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,157 @@@
++-----BEGIN PGP PUBLIC KEY BLOCK-----
++
++mQENBFG1+bQBCAC3p+fdi9+55LFuKPqW0XrQkQQ2CRfXcM5lqb6B4xQewLorsdX7
++SRDmLzpdDZ9bCpqxMsiFbB+9lxljHNTzx9BIEO9w6aYtVgPsG4L9ZxwBXUTlgtIA
++UoOy4lTQnUR0QDFlJQx8c4Cy82htOSCiWO4iaEvMbo+BGe8g4f2/N0tJOrnAc/xl
++sdA64GTWId4NB12F+QeRgWWNQs/W/j/kyy37+L0juD06RMKth0uRMN37wEa9KcLa
++lOBEUETrImZfx74wagt6WDnJknLf0ceqzfojk82po0C46BJAu49tLehYYKgo0HKZ
++fK7CDw53y9SjkI8cU8g48AyUw8Uk/FyJeW1bABEBAAG0N0RhdmlkIEVkbXVuZHNv
++biAoRGF2aWQgYXQgS0RFKSA8ZGF2aWRlZG11bmRzb25Aa2RlLm9yZz6JATgEEwEC
++ACIFAlG1+bQCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEPVnVgXHTgLP
++KD0H/0Cnj1bM6MYV5nKXJhLpd8as2OHFlhdtaU7QG3QcMVqdtP3rdOp1RgjmkYsB
++xgwrxvDTLz0L/PH9UTCXjQeZgNR0hG8iy4IBC9ay0PDdkNpjnHoAiUMRstcDODUZ
++QdLEOXCbPbRG3q0OlSaOvETL7YkSY8c2N6yqmWaJvudpJ0VVPyIWa2xT53JTXgAD
++4m1w8MThAZBZpJi852nQCByCsRC+3cofA7bQd60XLiFWgmnq+rlqryMlWvUmMmat
++e7U1NC5UsfH6ToXf/ZNZG+fMGE+ntYiHWRFr2tZMyXfUOrgHsAVMAE8v/xVtwS5e
++VCAdM21GNG4d6XiF7T32GDzrEQm5AQ0EUbX5tAEIAL0uLkPxHbg9boIuVdahyy6F
++BOcUf8xj3qj8FUGpRkcSSsoyvFTHZRTR+wwTPTaZzzzTFSITRGVv7vdKyl/A+SMw
++/nlUVfB9xGvvCgzPGesUk9lmxX2DRVpoq9CyVIw0XXJQtNkC3O1yEws4zuDzHe99
++sfDvXpA1ikfN+Hgn3oLjCHHtWuTyXGKXUimzToDMqWentVkP1rzKPlin9XJ0KDT/
++axrrD9L5s4KCjHdWEQwG3miJDxQnlsAFDBj7Bs8DZZE+xdzx/l8qBKOxmXD9ohFp
++4q0wXVV4QJMHtjhvhId9EN965drlYmMfusMCwavklBOWdR1MdSSBIYPS5eISmj0A
++EQEAAYkBHwQYAQIACQUCUbX5tAIbDAAKCRD1Z1YFx04Cz4CzCACpN1l39Yzoniqx
++laabcOrEbFjhKXlFXPm5TC+nj2iO8BieJLoltTcQL1nbxBHcxMkxUUJAVKBSmlh3
++BPjYJhXBNRvW/gamjaO+LoStXI+0vO4aOhkR0tLqA9/zQFM9uVPu6InS0N98oMaL
++azyxnXuqEanCN7yWfKHKxmkKiVMB1RMaE+2TYQBKPfFukiX2vv3qByVez8qYGa98
++80x6fkrqFbPoJ2oDXEGGD0W7fkv1pZV/1XCuXV/qKz3htD3AQDuLijqt6sM9Oe7Y
++Lsv5lqTb5DK6g2N9xvhTz64Z+j9bf44fbMReg3ub3GXlf9rFT8eDYfyYLJgWJ/1h
++YZximth9
++=QnRI
++-----END PGP PUBLIC KEY BLOCK-----
++-----BEGIN PGP PUBLIC KEY BLOCK-----
++
++mQENBFaTa+4BCACxyJ3oTNhz5oJOCu70mrxFqj/uqDfNm2K8Prr0CQ2I7yXijfTZ
++GVIjURIzp+Zhmc1LhZYlNwwI9ivFFvLoS9kH2rkx9EaIuP3ljtxQskRFrX4BepR9
++/EvIoi7tUuOEqCy2pRy/y7Rc7s3Qbu/sPQ17wvRQqzTKsvoh9wxat6990l1MFjlF
++/xBOD4Qb9LJGzc6Y8SLEEs7l/vAesL0viOME1hVQk+fG0KFosI32aeNnnLHPZbLi
++Z2YETvI5nROMhleSDusqUpVxXzkIBcVLbCyeJooRsZAhJ6AB8qvhOXx2xTBBgMpw
++aE/DHF6ZkvmsVB6lRNqMLjGeLOkmqx1vjZynABEBAAG0IkJodXNoYW4gU2hhaCAo
++a2RlKSA8YnNoYWhAa2RlLm9yZz6JATcEEwEIACEFAld3rtICGwMFCwkIBwIGFQgJ
++CgsCBBYCAwECHgECF4AACgkQ/geEEX+84R1tfwf9GSACMGPFi9AArBwFhaYUKB4B
++JqNgCSRvQJ7gtG6YAaW+o919AtmpO+nq0JtvrSXQVLbJ1jxEMXsNJnvZByiACm91
++u8z/LzMoI5C6RK13eGTTBr57LAE8lXI0xhkiSwQUAPQWJXumE1evoHExHrAi+z6a
++La6QXwyqmP5amwked6S6R9GxGI2c+UPm9sVh4Lb1L/pEzeCdt7/1R1baAQ+weI1c
++Vbfd4b9Qc5r/baq41CesZKz29UgorqiLyBXlWLUCClAXB/nrbAh7hR4pDhSsIExS
++Tp8gBnBTpKc2NAzGZTxopcvi/SOAxkdFlfkBewXuvHOxg0S8s8z7Owaeckbj7bQg
++Qmh1c2hhbiBTaGFoIDxiaHVzaDk0QGdtYWlsLmNvbT6JATcEEwEIACEFAlaTa+4C
++GwMFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQ/geEEX+84R3CQggAmSPWL+WB
++izj5WIcSZ2Ox1jCNnCcZ73K84s7ZSd83mq6fgi4O4/JqoZCMCU2YzMuo7Cs/h1UP
++XkARgf/bPFi7XKvEytQd0lOSUSubn27ederXfUuhUo5FNneiyYBX9Ri1RjOPv5oE
++3cmYWM34Xvl/O6ucRJ28s8Z9GuWG6NChbbHdkDIhulCzWWiMtIQXG7zGWRdjcqRI
++tGVSjEaCdyWEL6i//5n0TiM+PPidmFO4A56blLCHrIe6MPW/fAiWBzWpTxTUpn66
++XC3AMBWdLT/5ZCNea1qXY+I/TBwIiBl1mKFN1j945j216mnX1IHBSR01yrMxsBnJ
+++Hx3i32OxhEfjrQyQmh1c2hhbiBTaGFoIChteWtvbGFiIGFkZHJlc3MpIDxic2hh
++aEBteWtvbGFiLmNvbT6JAU4EEwEIADgWIQQKrHdbtkN6jZr3o6z+B4QRf7zhHQUC
++W4T3zwIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRD+B4QRf7zhHa3OB/0Q
++BQ8tc6WukC9ubRd5A1vEe5tSWvzJEB25mc+YfXj3eha9ZhGWSNF7iHQ278aKgyn4
++HS/Mve+A+w7ZQWtGK1sjxC1E7qn1U1Xx5BoadbvEfN8E9Vun0NPLa/FXtz6gTnGP
++OkgJ6NjQuEy6aKT9lGbHuxXBLPfGfEQrT16ny0+Nc3Is1cSIWsmyF59vZTH9Z8uJ
++u2C04lyMkE6huTdbLm6YAFzN3U2B/96ZG/9GWr1EImuVg9z7vUIlENbG/ARHbdGd
++TqwKzjLPMhMRmSQt9pjOA0K2/o9y7t6JgQiMC1DPl21INZHmYES9dlfyEiaLjVYk
++VunL/tJHXO9RIoqWx5nPuQENBFaTa+4BCAC8D6XyewOHX+nTc4mBQfLmrmNJu6RX
++7kY/cwvAsskevOTNPzgJJtnUJQI1iABWI7U88afjAvU1wzYrBfEfQ43h1cPw6NMY
++4/cmHe8YimCgk8cNYKGS0sM3+YJ8hNTSGxKJa7Y3RDxDLK9fSqG1xa6URcctNT57
++rau7xUtVExFpN0qGeTtMAOLDp36wY+jSYBpVZ7/Z/j0SDQf9ShU0G2OZMKsZvcH1
++KadOVW4kT27ISHN7EJbjdMPCmZytJ+5Sxi9PFHYCr/nR1qBY/j0ouKS71uShzcss
++z5WgnkmP87fvsfpfCQJl5SkiPavddodZoBCRRKwqQnV7ns3JFmh7U2+lABEBAAGJ
++AR8EGAEIAAkFAlaTa+4CGwwACgkQ/geEEX+84R040gf9G+I/AM1ub7UAhPAQPZ25
++SdIaTH96MV5cmWsucTnGUy1XDh8I0hZaEB/kkWHOrmbKyqhg/NtgEqXtP/kqJX5r
++uTt9AN3TSlxJ+IrCywCm33kS7yPRADgwNshoCf/HH3VujccN4KfDjIuijLSZbfIb
++G6cGo2bgqz6t4p9NaZofcQhFfPwAgfv3IL1DNFqZvUohDPy/j5eU7IdDjytLnhGU
++ZTfSrzhWXkCZybKROW05zScMRd5uL3b+in/Zu8rgeE/lLF8nmD42YJ058n+72LjR
++7P5DqrblbAhLiQg8CBbrIFJozQUyUDnTzwsGRFuQAx7brypsOSqWfYcVEqXxiJwd
++rLkBDQRaK92CAQgAuuXV+Yh0qYO6WQZLnE+X0BivPlRY1vH4B2zDgDBY0qrbIdPl
++4/pvbwQLk/Vo2yVZqHfoGhbqnBkXZFpzV9QMOnEdrrMo8unm/02f7buEZ56XkkKT
++pelsl63Qu0qu2/ISpfxCxRFLGZdj+VLA0SWhe0ecwgR+91ZvcKE1byfzG9+sbVY0
++v8WQq9Zfx0hUo/0Jf7+FAiUWIgmS6XHuCn+DYBTHrGcGEf+CU64+lfH5CbGz42AK
++qsYzZwYWV4RarwNBVDuM6XdqlC9m4WcROos5qyV0XQ5sE/SByuHO1a5ZazFFPbrn
++qiBtg1POQs4uQw4wU2RsEM+bGUIRNTFoIpjHsQARAQABiQJsBBgBCAAgFiEECqx3
++W7ZDeo2a96Os/geEEX+84R0FAlor3YICGwIBQAkQ/geEEX+84R3AdCAEGQEIAB0W
++IQSzyzZlUlQL4G7prZcRloxEkoyu/AUCWivdggAKCRARloxEkoyu/GVJB/90wdV5
++Bsb53X/ai1HdScE7dP+clhDjVEgU87601F7cntzeo9EASso2YLdkXnNE4Gq8THUp
++XLk/PLTlum5z2OrOYbcfrzWU1kLRguDgVciqcyI+4ev5P5wchTrLrROX7uyEGq5f
++THYi7xEmolRGXFUEAcsWRGwS6DOq28sDSbho+LRLXyPBFVE6lTmXzjIaw5pxPgMX
++HGPjb2vuHP3hcFS38CkbKgFgnvlCzeCea3y6rVs86xVUi/l1C/tAdTFHkxbQQzyo
++bNWOF55ujh12iWOPFqlaLXSJcSgRb6JBumPS3X4g3DEOeWLKOXgqXXWdTz9n925G
++1s9Zz5EqRGOPg5tUNpoH/iDhWtorPX9ypuWLPmJzq/e/6l7d1YY5p1FP88fG+33L
++DOxP69pCqfIoS4h3xtIBtq6ZOD8veVhb4GXSX3o1/rHEur1wj8JdIKTiyLQcc0bE
++/qqkU1z2wtPDnpDMiSp+K0XzuerrOkTR3Nvbjq1N3eAT7cp9u+t9jINBe4L36+Dz
++QZdwUGvi7ojMPTY2vKM6VZSHEKDmw1C4Ifp9oSEVAlQk2AslldLA/8huA3V752+C
++osVz4kO0g/fi1LqkTskFfRVO7Y1Zbs5N4qb/2rdXp4cYEmKNe/II+y9xoCxyobBE
++ZBECLHCZfIdO2sB4nt72Y+0/G52cW2Gz2yjbP0MaZp25AQ0EWivdvQEIALOgPIfa
++CxMoYYORHfLJsJ56uOGP6YchINfy7wGVvtNPvnbC4Xp6q8UPSijoukjafw5ZPZFu
++BZ7E3Qq4Vx/eRTcHoYq40CahxFDmUvt6bnDCFlsMXNXCSOUtnhej5clMjCtm7awt
++kOD25JQry3AmmxAeQv807LBciYy+/idRlav1sQyUOgchiS/nsSQX+lktjwXKks7Q
++j/3Oplu+D8jTig2qGdNUredkbgZhsVsdvitmuJuBq3Iaw2ilX4l69g9ioxBi7481
++bmaLV1P2BtHsqUpmE7wpw4JdQ+NTBiAPuM+Oqo28mWTVoov5SH9QHOevgVJKCfM7
++RfBj8zGVJ3H/DcsAEQEAAYkBNgQYAQgAIBYhBAqsd1u2Q3qNmvejrP4HhBF/vOEd
++BQJaK929AhsgAAoJEP4HhBF/vOEd33QIAIV/Wuhv+KHYKkKzwzJYqEZEKReFqSk9
++1W+etHDf72mPB3J+IfokNYCSgEm4R/570p9uIBBccxLPwTvbJU7v9Utvc0kFcu9t
++xNWOge0W046qquRoWIwFZxbLwcSl8Xwlhitrt1TAZPrsIRxyzXzHeE9VTIAWQftn
++jvRGp8KfdCXoLglMkb4KRF65pzMPf51hPSQ57b2VhmwZoh9Y4b5FM4cgKdoug2Ch
++/gPFWTd0KGWuSRs8xKnUugk3X0j089po81j1DTcMezAz9QZbSs1qM1Phxl/SaJEE
++wb/SP6PaGS9MPvfMpshuzz/St5LWesGCOJHMG6cWIm/QAFIuV7WWKpg=
++=j9MJ
++-----END PGP PUBLIC KEY BLOCK-----
++-----BEGIN PGP PUBLIC KEY BLOCK-----
++
++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
++oS4=
++=yOFv
++-----END PGP PUBLIC KEY BLOCK-----
diff --cc debian/watch
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2ad67ac668b529764321209489ed5eaf68a325c1
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++version=4
++opts=pgpsigurlmangle=s/$/.sig/ https://download.kde.org/stable/plasma/([\d.]+)/@PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@