From 9994c4e3b625b04ee83ec2b82dd4f5dceb2ecef5 Mon Sep 17 00:00:00 2001 From: Markus Fritsche Date: Fri, 24 Apr 2026 20:03:16 +0000 Subject: [PATCH] arch/ffmpeg-v4l2-request-git: FFmpeg 8.1 + V4L2-Request hwaccel for Fourier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First carrier package for the Fourier umbrella. Tracks Kwiboo's v4l2-request-n8.1 branch (ffmpeg 8.1 base) pinned at commit b57fbbe — bump _commit to rebase onto newer tip. CI job chained after claude-his-any so it serializes on the shared aarch64 repo-db; continue-on-error: true so long ffmpeg builds don't block the debian downstream. Deliberately diverges from the AUR package: - AUR pins 6.1.1 with epoch=2 → would downgrade stock Arch ffmpeg 2:8.1-3. We track 8.1 so install is a sideways swap, not a regression. - AUR pulls X11/AMF/CUDA/FireWire/AviSynth/OpenMPT/Bluray/OpenMAX/JPEG-XL/ Theora/XVid/rsvg/soxr/ssh/vidstab/modplug/SDL2/Vulkan/JACK/GSM/Speex — dropped here; none are needed on a Wayland ARM video-decode fleet. - AUR uses #branch=…, sha256sums=(SKIP) → every build is tip-of-branch, not reproducible. We pin via #commit=. Kept: encoders (libx264/libx265/libvpx/libdav1d), VAAPI, libdrm, libv4l2, neon, OpenGL, PulseAudio, subtitle/font stack, gnutls TLS. SDL2 dropped means no ffplay binary (mpv covers interactive playback). provides=(ffmpeg) conflicts=(ffmpeg) so it replaces stock ffmpeg on the target host deliberately. Primary consumers: ohm (Fourier step 5), fresnel, ampere. --- .gitea/workflows/build.yml | 111 ++++++++++++++++++++ arch/ffmpeg-v4l2-request-git/PKGBUILD | 139 ++++++++++++++++++++++++++ 2 files changed, 250 insertions(+) create mode 100644 arch/ffmpeg-v4l2-request-git/PKGBUILD diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 77076a351..80e1e0a01 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -371,6 +371,117 @@ jobs: if: always() run: rm -f /root/repo_pass /root/.ssh/id_ed25519 + # ------------------------------------------------------------------------- + # ffmpeg-v4l2-request-git (aarch64 only) — FFmpeg with V4L2 Request API + # hwaccel for Rockchip / Allwinner stateless decoders. Used by the Fourier + # umbrella (ohm, fresnel, ampere). Long-running build, so failures don't + # block downstream debian jobs. + # ------------------------------------------------------------------------- + ffmpeg-v4l2-request-aarch64: + needs: claude-his-any + 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 nasm + + - 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 ffmpeg-v4l2-request-git + run: | + set -e + rm -rf /tmp/build-ffmpeg-v4l2 + cp -r arch/ffmpeg-v4l2-request-git /tmp/build-ffmpeg-v4l2 + chown -R builder:builder /tmp/build-ffmpeg-v4l2 + cd /tmp/build-ffmpeg-v4l2 + # Parallelise: fermi has 4 A55 cores; -j4 fits RAM during link. + sudo -u builder -H env MAKEFLAGS="-j$(nproc)" \ + makepkg --nocheck --noconfirm --syncdeps --cleanbuild + ls -la *.pkg.tar.* | grep -v "\.sig$" + + - name: sign ffmpeg-v4l2-request-git + run: | + set -e + cd /tmp/build-ffmpeg-v4l2 + 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-ffmpeg + cd /tmp/arch-stage-ffmpeg + 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-ffmpeg-v4l2/*.pkg.tar.$ext 2>/dev/null && \ + mv /tmp/build-ffmpeg-v4l2/*.pkg.tar.$ext /tmp/build-ffmpeg-v4l2/*.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-ffmpeg + 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/ffmpeg-v4l2-request-git/PKGBUILD b/arch/ffmpeg-v4l2-request-git/PKGBUILD new file mode 100644 index 000000000..8be9ee24f --- /dev/null +++ b/arch/ffmpeg-v4l2-request-git/PKGBUILD @@ -0,0 +1,139 @@ +# Maintainer: Markus Fritsche +# +# FFmpeg + V4L2-Request hwaccel (stateless video decode on Rockchip, +# Allwinner, etc) for the Fourier umbrella. Tracks Kwiboo's long-running +# rebase of Jernej Škrabec's v4l2-request patchset onto ffmpeg release +# tags. Pins the branch tip to a known commit for reproducible CI builds; +# bump _commit when upstream picks up a fix we want. +# +# Why this fork instead of AUR ffmpeg-v4l2-request-git: +# - AUR is pinned to 6.1.1 with epoch=2, which is OLDER than Arch's +# stock 2:8.1-3 → installing it downgrades system ffmpeg. +# - AUR pulls X11/AMF/CUDA/FireWire/AviSynth/OpenMPT/Bluray — irrelevant +# for a Wayland + ARM + video-decode fleet. +# - AUR uses #branch=..., no commit pin. CI artifacts are non-reproducible. +# +# Encoders (libx264/libx265/libvpx/libdav1d) kept per Fourier fleet policy. +# X11, AMF, CUDA, FireWire, AviSynth, OpenMPT, Bluray, OpenMAX, JPEG-XL, +# Theora, XVid, rsvg, soxr, ssh, vidstab, modplug, SDL2, Vulkan, JACK, GSM, +# Speex dropped — not needed on the Fourier fleet. (No SDL2 means no +# `ffplay` binary; mpv covers interactive playback.) + +pkgname=ffmpeg-v4l2-request-git +_srcname=FFmpeg +_version='8.1' +_commit='b57fbbe50c9b2656fad86a1a7eeabfd2b2a50935' # v4l2-request-n8.1 tip 2026-04-24 +pkgver=8.1.r0.b57fbbe +pkgrel=1 +epoch=2 +pkgdesc='FFmpeg with V4L2 Request API hwaccel (Rockchip / Allwinner stateless decode)' +arch=('aarch64') +url='https://github.com/Kwiboo/FFmpeg' +license=('GPL-3.0-or-later') +depends=( + alsa-lib + bzip2 + fontconfig + fribidi + gmp + gnutls + lame + libass.so + libdav1d.so + libdrm + libfreetype.so + libgl + libpulse + libva.so + libva-drm.so + libvorbis.so + libvorbisenc.so + libvpx.so + libwebp + libx264.so + libx265.so + libxml2 + opus + v4l-utils + xz + zlib +) +makedepends=( + git + linux-api-headers + mesa + nasm +) +provides=( + libavcodec.so + libavdevice.so + libavfilter.so + libavformat.so + libavutil.so + libpostproc.so + libswresample.so + libswscale.so + ffmpeg +) +conflicts=(ffmpeg) +source=("git+https://github.com/Kwiboo/FFmpeg.git#commit=${_commit}") +sha256sums=('SKIP') + +pkgver() { + cd "${_srcname}" + printf '%s.r%s.%s' "${_version}" \ + "$(git rev-list --count HEAD)" \ + "$(git rev-parse --short=7 HEAD)" +} + +build() { + cd "${_srcname}" + + ./configure \ + --prefix=/usr \ + --disable-debug \ + --disable-static \ + --disable-doc \ + --disable-stripping \ + --enable-shared \ + --enable-gpl \ + --enable-version3 \ + --enable-pic \ + --enable-neon \ + --arch=aarch64 \ + \ + --enable-libdrm \ + --enable-libv4l2 \ + --enable-libudev \ + --enable-v4l2-request \ + --enable-v4l2_m2m \ + --enable-vaapi \ + --enable-opengl \ + \ + --enable-gnutls \ + --enable-fontconfig \ + --enable-libass \ + --enable-libfreetype \ + --enable-libfribidi \ + --enable-libxml2 \ + --enable-libpulse \ + --enable-libdav1d \ + --enable-libopus \ + --enable-libvorbis \ + --enable-libmp3lame \ + --enable-libvpx \ + --enable-libx264 \ + --enable-libx265 \ + --enable-libwebp \ + \ + --host-cflags='-fPIC' + + make + make tools/qt-faststart +} + +package() { + cd "${_srcname}" + make DESTDIR="${pkgdir}" install + install -Dm755 tools/qt-faststart "${pkgdir}/usr/bin/qt-faststart" +}