From 375be40deb24c8de191d83aa1d5369f21576db0d Mon Sep 17 00:00:00 2001 From: Markus Fritsche Date: Fri, 8 May 2026 14:48:03 +0000 Subject: [PATCH] add mpv-fourier scaffold (delivery vehicle for dmabuf-modifier-triage iter1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mpv on ohm is currently stock arch from [extra]. To ship the vo_dmabuf_wayland plane-semantics fix per marfrit/dmabuf-modifier-triage#1, we need an mpv-fourier package following the same fourier-umbrella pattern as kwin-fourier, qt6-base-fourier, firefox-fourier, libva-v4l2-request-fourier. This commit lays down: - arch/mpv-fourier/PKGBUILD pinning upstream mpv 0.41.0 tarball, with empty patch slot in prepare(). replaces=mpv. provides=mpv,libmpv.so. When iter1 produces the patch, add it to source=()/sha256sums=() and uncomment the patch -p1 line. - arch/mpv-fourier/README.md documenting why + tracker links - .gitea/workflows/build.yml job mpv-fourier-aarch64 chained after libva-v4l2-request-fourier-aarch64 for marfrit.db serialization. Same fermi LXC runner, same makepkg → sign → repo-add → rsync flow. Initial scaffold builds vanilla mpv 0.41.0 with no fourier patches — once iter1 lands, bump pkgrel and add the patch. Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitea/workflows/build.yml | 110 ++++++++++++++++++++++++++++++ arch/mpv-fourier/PKGBUILD | 134 +++++++++++++++++++++++++++++++++++++ arch/mpv-fourier/README.md | 40 +++++++++++ 3 files changed, 284 insertions(+) create mode 100644 arch/mpv-fourier/PKGBUILD create mode 100644 arch/mpv-fourier/README.md diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 86a3b34bd..88493527b 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -592,6 +592,116 @@ jobs: if: always() run: rm -f /root/repo_pass /root/.ssh/id_ed25519 + # ------------------------------------------------------------------------- + # mpv-fourier (aarch64 only) — mpv with fourier-umbrella patches. + # Patch slot exists for the vo_dmabuf_wayland plane-semantics fix per + # marfrit/dmabuf-modifier-triage#1. Initial scaffold builds vanilla + # mpv 0.41.0 — bump pkgrel and add patch to source=() when iter1 lands. + # ------------------------------------------------------------------------- + mpv-fourier-aarch64: + needs: libva-v4l2-request-fourier-aarch64 + runs-on: arch-aarch64 + continue-on-error: true + steps: + - uses: actions/checkout@v4 + + - name: bootstrap runner (idempotent) + run: | + set -e + retry() { for i in 1 2 3; do "$@" && return 0; rc=$?; echo "retry $i (exit=$rc)" >&2; sleep $((i*5)); done; return 1; } + retry pacman -Syu --noconfirm --needed base-devel git rsync gnupg openssh sudo + + - name: import signing key + env: + PRIV: ${{ secrets.MARFRIT_REPO_PRIVATE_KEY }} + PASS: ${{ secrets.MARFRIT_REPO_PASSPHRASE }} + run: | + set -e + rm -rf /root/.gnupg /root/repo_pass + mkdir -m700 -p /root/.gnupg + printf '%s' "$PASS" > /root/repo_pass + chmod 600 /root/repo_pass + printf '%s\n' "$PRIV" | gpg --batch --import + echo "92D5E96D8F63C75E4116AA1FF5C8C4603D0D250C:6:" | gpg --import-ownertrust + + - name: install deploy ssh key + env: + KEY: ${{ secrets.MARFRIT_REPO_DEPLOY_KEY }} + run: | + mkdir -m700 -p /root/.ssh + printf '%s\n' "$KEY" > /root/.ssh/id_ed25519 + chmod 600 /root/.ssh/id_ed25519 + ssh-keyscan -t ed25519 nc.reauktion.de > /root/.ssh/known_hosts 2>/dev/null + + - name: makepkg mpv-fourier + run: | + set -e + rm -rf /tmp/build-mpv + cp -r arch/mpv-fourier /tmp/build-mpv + chown -R builder:builder /tmp/build-mpv + cd /tmp/build-mpv + sudo -u builder -H env MAKEFLAGS="-j$(nproc)" \ + makepkg --nocheck --noconfirm --syncdeps --cleanbuild + ls -la *.pkg.tar.* | grep -v "\.sig$" + + - name: sign mpv-fourier + run: | + set -e + cd /tmp/build-mpv + for f in *.pkg.tar.xz *.pkg.tar.zst *.pkg.tar.gz; do + [ -f "$f" ] || continue + gpg --batch --pinentry-mode loopback --passphrase-file /root/repo_pass \ + --detach-sign --yes -u 92D5E96D8F63C75E4116AA1FF5C8C4603D0D250C "$f" + done + + - name: update aarch64 repo db + run: | + set -e + mkdir -p /tmp/arch-stage-mpv + cd /tmp/arch-stage-mpv + rm -f * + for f in marfrit.db.tar.gz marfrit.db.tar.gz.sig marfrit.files.tar.gz marfrit.files.tar.gz.sig; do + curl -sSLf "https://packages.reauktion.de/arch/aarch64/$f" -o "$f" || rm -f "$f" + done + for ext in xz zst gz; do + ls /tmp/build-mpv/*.pkg.tar.$ext 2>/dev/null && \ + mv /tmp/build-mpv/*.pkg.tar.$ext /tmp/build-mpv/*.pkg.tar.$ext.sig . + done || true + export GNUPGHOME=/root/.gnupg + printf 'pinentry-mode loopback\npassphrase-file /root/repo_pass\n' > /root/.gnupg/gpg.conf + printf 'allow-loopback-pinentry\n' > /root/.gnupg/gpg-agent.conf + gpg-connect-agent reloadagent /bye + pkgs=() + for ext in xz zst gz; do + for f in *.pkg.tar.$ext; do [ -f "$f" ] && pkgs+=("$f"); done + done + if [ -f marfrit.db.tar.gz ]; then + for f in "${pkgs[@]}"; do + name=$(echo "$f" | sed -E 's/-[0-9].*//') + repo-remove --sign --key 92D5E96D8F63C75E4116AA1FF5C8C4603D0D250C \ + marfrit.db.tar.gz "$name" 2>/dev/null || true + done + fi + repo-add --new --sign --key 92D5E96D8F63C75E4116AA1FF5C8C4603D0D250C \ + --verify marfrit.db.tar.gz "${pkgs[@]}" + ln -sf marfrit.db.tar.gz marfrit.db + ln -sf marfrit.files.tar.gz marfrit.files + ln -sf marfrit.db.tar.gz.sig marfrit.db.sig + rm -f marfrit.files.sig + + - name: publish to aarch64 + run: | + set -e + retry() { for i in 1 2 3; do "$@" && return 0; rc=$?; echo "retry $i (exit=$rc)" >&2; sleep $((i*5)); done; return 1; } + cd /tmp/arch-stage-mpv + retry rsync -avL --copy-unsafe-links \ + -e 'ssh -i /root/.ssh/id_ed25519' \ + ./ mfritsche@nc.reauktion.de:arch/aarch64/ + + - name: wipe secrets + if: always() + run: rm -f /root/repo_pass /root/.ssh/id_ed25519 + # ------------------------------------------------------------------------- # claude-his-agent Debian (Architecture: all) — same dpkg-deb pattern as # lmcp-debian; publishes to bookworm + trixie via hertz reprepro. diff --git a/arch/mpv-fourier/PKGBUILD b/arch/mpv-fourier/PKGBUILD new file mode 100644 index 000000000..3c83f5482 --- /dev/null +++ b/arch/mpv-fourier/PKGBUILD @@ -0,0 +1,134 @@ +# Maintainer: Markus Fritsche +# +# mpv-fourier — mpv with the fourier-umbrella patches. The first patch +# slot exists for the vo_dmabuf_wayland plane-semantics fix per +# marfrit/dmabuf-modifier-triage#1: mpv currently constructs the +# zwp_linux_buffer_params_v1 wl_protocol message with internally +# inconsistent plane semantics on V4L2 stateless decoder dmabufs (per- +# plane fds combined with single-allocation offset for plane 1), causing +# KWin to read the UV chroma plane past-EOF and render solid dark green +# on ohm (RK3566 + hantro G1 + Mali-G52). The patch is not yet written — +# this scaffold prepares the shipping path for when iter1 lands. +# +# Campaign: ~/src/dmabuf-modifier-triage/ (Phase 0 closed 2026-05-08) +# Upstream: https://github.com/mpv-player/mpv +# Build target: fermi LXC actrunner-aarch64-hertz via marfrit-packages +# Gitea Actions; alternative: boltzmann via his subagent + marfrit-publish. + +pkgname=mpv-fourier +_upstreampkg=mpv +pkgver=0.41.0 +pkgrel=1 +pkgdesc='mpv with fourier-umbrella patches (vo_dmabuf_wayland plane-semantics fix slot)' +arch=('aarch64') +url='https://mpv.io/' +license=('GPL-2.0-or-later' 'LGPL-2.1-or-later') +depends=( + alsa-lib + desktop-file-utils + ffmpeg + glibc + hicolor-icon-theme + jack + lcms2 + libarchive + libass + libbluray + libcdio + libcdio-paranoia + libdisplay-info + libdrm + libdvdnav + libdvdread + libegl + libgl + libglvnd + libjpeg-turbo + libplacebo + libpulse + libsixel + libva + libvdpau + libx11 + libxext + libxkbcommon + libxpresent + libxrandr + libxss + libxv + luajit + mesa + mujs + libpipewire + rubberband + sdl2 + openal + uchardet + vapoursynth + vulkan-icd-loader + wayland + zlib +) +makedepends=( + git + meson + ninja + pkgconf + python-docutils + wayland-protocols +) +optdepends=( + 'yt-dlp: for video-sharing websites playback' +) +provides=("${_upstreampkg}=${pkgver}" 'libmpv.so') +conflicts=("${_upstreampkg}") +replaces=("${_upstreampkg}") + +source=( + "${_upstreampkg}-${pkgver}.tar.gz::https://github.com/mpv-player/${_upstreampkg}/archive/v${pkgver}/${_upstreampkg}-${pkgver}.tar.gz" +) +sha256sums=( + 'ee21092a5ee427353392360929dc64645c54479aefdb5babc5cfbb5fad626209' +) + +prepare() { + cd "${_upstreampkg}-${pkgver}" + + # Patch slot — iter1 of dmabuf-modifier-triage will produce the actual + # vo_dmabuf_wayland.c plane-semantics fix and add it as 0001-... here. + # Once the libva path is also unblocked (by libva-multiplanar iter9) + # and the WAYLAND_DEBUG verifier confirms whether the bug is purely in + # mpv's VO or also in libva/ffmpeg producer code, the exact patch + # shape is determined. + # + # When the patch lands, add it to source=() above + sha256sums=() and + # uncomment the patch -p1 below. + # + # patch -p1 < "${srcdir}/0001-vo_dmabuf_wayland-plane-semantics.patch" + : +} + +build() { + cd "${_upstreampkg}-${pkgver}" + arch-meson build \ + --buildtype=release \ + -Dlibmpv=true \ + -Dmanpage-build=enabled \ + -Dcdda=enabled \ + -Ddvbin=enabled \ + -Ddvdnav=enabled \ + -Dlibarchive=enabled \ + -Dopenal=enabled \ + -Dsdl2-audio=enabled \ + -Dsdl2-video=enabled \ + -Dsdl2-gamepad=enabled + meson compile -C build +} + +package() { + cd "${_upstreampkg}-${pkgver}" + meson install -C build --destdir "${pkgdir}" + + install -Dm644 LICENSE.GPL "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE.GPL" + install -Dm644 LICENSE.LGPL "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE.LGPL" +} diff --git a/arch/mpv-fourier/README.md b/arch/mpv-fourier/README.md new file mode 100644 index 000000000..78aac685c --- /dev/null +++ b/arch/mpv-fourier/README.md @@ -0,0 +1,40 @@ +# mpv-fourier + +mpv with the fourier-umbrella patches. + +## Why + +The dmabuf-modifier-triage campaign isolated the green-frames bug on ohm +to mpv's `vo_dmabuf_wayland.c` plane-semantics handling for V4L2 stateless +decoder dmabufs. mpv currently emits a `zwp_linux_buffer_params_v1` +message that mixes per-plane fds (V4L2 MPLANE export) with a single- +allocation offset for plane 1, causing KWin to read the UV chroma plane +past-EOF on the UV-plane fd and render solid dark green. + +This package is the delivery vehicle for the fix once it's written. +PKGBUILD is in place with an empty patch slot; the patch itself is iter1 +of the triage campaign. + +## Tracker + +- Bug: [marfrit/dmabuf-modifier-triage#1](https://git.reauktion.de/marfrit/dmabuf-modifier-triage/issues/1) +- Symptom-tracker: [marfrit/libva-multiplanar#1](https://git.reauktion.de/marfrit/libva-multiplanar/issues/1) +- Acceptance criterion: `~/src/dmabuf-modifier-triage/screenshots/` + +## Status + +- 2026-05-08: scaffold landed. Builds vanilla mpv 0.41.0 with no + fourier patches applied (patch slot empty in `prepare()`). pkgrel=1 + pinned to mpv release v0.41.0. + +When iter1 of the triage campaign produces the patch, bump pkgrel, +add the patch to `source=()` and `sha256sums=()`, uncomment the +`patch -p1` line in `prepare()`. + +## Hosts that benefit + +Only hosts that exercise the V4L2 stateless dmabuf-wayland path — +ohm (RK3566 + hantro G1) today, fresnel (RK3399 + hantro + rkvdec) +once that campaign reaches its mpv-test phase. Other hosts on +[marfrit] (boltzmann, hertz desktop) won't see any difference as +the fix is no-op for non-V4L2-stateless dmabuf paths.