diff --git a/debian/ffmpeg-v4l2-request-fourier/0001-libudev-bypass-fallback.patch b/debian/ffmpeg-v4l2-request-fourier/0001-libudev-bypass-fallback.patch new file mode 100644 index 000000000..27041af6e --- /dev/null +++ b/debian/ffmpeg-v4l2-request-fourier/0001-libudev-bypass-fallback.patch @@ -0,0 +1,166 @@ +--- a/libavutil/hwcontext_v4l2request.c ++++ b/libavutil/hwcontext_v4l2request.c +@@ -19,12 +19,13 @@ + #include "config.h" + + #include + #include + #include + #include ++#include + #include + #include + + #include + #include + +@@ -690,12 +691,125 @@ + } + + udev_enumerate_unref(enumerate); + return ret; + } + ++/* ++ * Brute-force fallback used when libudev's scan fails (e.g. inside firefox's ++ * RDD sandbox where Mozilla's broker rejects fd-relative openat used by ++ * systemd's chase() symlink resolver). Iterates /dev/video[0..63], picks the ++ * one whose major/minor matches the requested devnum. ++ */ ++static char *v4l2request_devnum_to_video_path_brute(dev_t devnum) ++{ ++ char path[32]; ++ struct stat st; ++ for (int i = 0; i < 64; i++) { ++ snprintf(path, sizeof(path), "/dev/video%d", i); ++ if (stat(path, &st) < 0) ++ continue; ++ if (st.st_rdev == devnum) ++ return av_strdup(path); ++ } ++ return NULL; ++} ++ ++/* Brute-force version of v4l2request_probe_video_devices: replaces the ++ * udev_device_new_from_devnum + udev_device_get_devnode flow with ++ * stat()-based major/minor matching against /dev/video[0..63]. */ ++static int v4l2request_probe_video_devices_brute(AVHWFramesContext *hwfc, ++ uint32_t pixelformat, ++ uint32_t buffersize) ++{ ++ AVV4L2RequestFramesContext *fctx = hwfc->hwctx; ++ AVV4L2RequestFramesContextInternal *fctxi = fctx->internal; ++ struct media_device_info device_info; ++ struct media_v2_topology topology = {0}; ++ struct media_v2_interface *interfaces; ++ char *path; ++ dev_t devnum; ++ int ret; ++ ++ if (ioctl(fctxi->media_fd, MEDIA_IOC_DEVICE_INFO, &device_info) < 0) ++ return AVERROR(errno); ++ ++ if (ioctl(fctxi->media_fd, MEDIA_IOC_G_TOPOLOGY, &topology) < 0) ++ return AVERROR(errno); ++ ++ if (!topology.num_interfaces) ++ return AVERROR(ENOENT); ++ ++ interfaces = av_calloc(topology.num_interfaces, ++ sizeof(struct media_v2_interface)); ++ if (!interfaces) ++ return AVERROR(ENOMEM); ++ ++ topology.ptr_interfaces = (__u64)(uintptr_t)interfaces; ++ if (ioctl(fctxi->media_fd, MEDIA_IOC_G_TOPOLOGY, &topology) < 0) { ++ ret = AVERROR(errno); ++ goto fail; ++ } ++ ++ ret = AVERROR(ENOENT); ++ for (unsigned i = 0; i < topology.num_interfaces; i++) { ++ if (interfaces[i].intf_type != MEDIA_INTF_T_V4L_VIDEO) ++ continue; ++ ++ devnum = makedev(interfaces[i].devnode.major, ++ interfaces[i].devnode.minor); ++ path = v4l2request_devnum_to_video_path_brute(devnum); ++ if (!path) ++ continue; ++ ++ ret = v4l2request_probe_video_device(hwfc, path, pixelformat, buffersize); ++ if (!ret) { ++ av_log(hwfc, AV_LOG_INFO, ++ "Using V4L2 media driver %s (brute-force) for %s\n", ++ device_info.driver, av_fourcc2str(pixelformat)); ++ av_free(path); ++ break; ++ } ++ av_free(path); ++ } ++ ++fail: ++ av_free(interfaces); ++ return ret; ++} ++ ++/* Brute-force fallback for v4l2request_probe_media_devices(). Iterates ++ * /dev/media[0..15], opens each, probes via topology+stat. */ ++static int v4l2request_probe_media_devices_brute(AVHWFramesContext *hwfc, ++ uint32_t pixelformat, ++ uint32_t buffersize) ++{ ++ AVV4L2RequestFramesContext *fctx = hwfc->hwctx; ++ AVV4L2RequestFramesContextInternal *fctxi = fctx->internal; ++ char path[32]; ++ int ret = AVERROR(ENOENT); ++ ++ for (int i = 0; i < 16; i++) { ++ snprintf(path, sizeof(path), "/dev/media%d", i); ++ ++ fctxi->media_fd = open(path, O_RDWR); ++ if (fctxi->media_fd < 0) ++ continue; ++ ++ ret = v4l2request_probe_video_devices_brute(hwfc, pixelformat, ++ buffersize); ++ if (!ret) ++ return 0; ++ ++ close(fctxi->media_fd); ++ fctxi->media_fd = -1; ++ } ++ ++ return ret; ++} ++ + static int v4l2request_open_decoder(AVHWFramesContext *hwfc) + { + AVV4L2RequestFramesContext *fctx = hwfc->hwctx; + uint32_t buffersize; + struct udev *udev; + int ret; +@@ -712,12 +826,23 @@ + + buffersize = FFMAX(hwfc->width * hwfc->height * 3 / 2, 256 * 1024); + + // Probe all media devices (auto-detection) + ret = v4l2request_probe_media_devices(hwfc, udev, fctx->pixelformat, buffersize); + ++ // Brute-force fallback when libudev fails. Firefox-fourier hits this ++ // because Mozilla's RDD sandbox blocks fd-relative openat used by ++ // systemd's chase() symlink resolver inside udev_enumerate_scan_devices. ++ if (ret < 0) { ++ av_log(hwfc, AV_LOG_INFO, ++ "libudev probe failed (%d), falling back to brute-force /dev/media*\n", ++ ret); ++ ret = v4l2request_probe_media_devices_brute(hwfc, fctx->pixelformat, ++ buffersize); ++ } ++ + udev_unref(udev); + return ret; + } + + static AVBufferRef *v4l2request_v4l2_buffer_alloc(AVHWFramesContext *hwfc, + struct v4l2_format *format) diff --git a/debian/ffmpeg-v4l2-request-fourier/0002-nv15-to-p010-unpack.patch b/debian/ffmpeg-v4l2-request-fourier/0002-nv15-to-p010-unpack.patch new file mode 100644 index 000000000..8a2a2f04d --- /dev/null +++ b/debian/ffmpeg-v4l2-request-fourier/0002-nv15-to-p010-unpack.patch @@ -0,0 +1,178 @@ +From 0cd6e669735e453ec8772f111065bbb2f70a5bc6 Mon Sep 17 00:00:00 2001 +From: Markus Fritsche +Date: Mon, 18 May 2026 07:27:10 +0000 +Subject: [PATCH] avutil/hwcontext_v4l2request: unpack NV15 to P010 in + transfer_data_from +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +V4L2_PIX_FMT_NV15 (RK3399/RK3588 rkvdec 10-bit 4:2:0 capture) is mapped to +sw_format = AV_PIX_FMT_YUV420P10 in v4l2request_capture_pixelformats[]. The +existing transfer_get_formats explicitly blanked the format list for that +sw_format, so 'ffmpeg -hwaccel v4l2request -vf hwdownload,format=p010le' on +a Hi10P / Main10 input failed at filter init with EINVAL before reaching +the actual decode (which itself succeeds — 2 frames decoded cleanly). + +Expose AV_PIX_FMT_P010 as the transfer target for NV15-backed surfaces and +unpack the packed 10-bit samples into the standard high-bits-of-16 layout +inside transfer_data_from. Luma and chroma share the same packing format +(5 bytes per 4 samples, little endian); chroma plane is W × H/2 samples +for 4:2:0. + +The other 'needs custom unpack' sw_formats (YUV420P / Allwinner NV12_32L32 +tiled and YUV422P10 / rkvdec NV20) keep the original ENOSYS path because +they need different unpack code that isn't covered by this patch. + +Closes marfrit/marfrit-packages#21. +--- + libavutil/hwcontext_v4l2request.c | 111 +++++++++++++++++++++++++++++- + 1 file changed, 110 insertions(+), 1 deletion(-) + +diff --git a/libavutil/hwcontext_v4l2request.c b/libavutil/hwcontext_v4l2request.c +index b6633d9081..3842160dfb 100644 +--- a/libavutil/hwcontext_v4l2request.c ++++ b/libavutil/hwcontext_v4l2request.c +@@ -1073,6 +1073,56 @@ fail: + return ret; + } + ++/* ++ * Unpack one NV15-packed 10-bit plane (5 bytes per 4 samples, little endian) ++ * into a P010-style plane (10 bits in the high bits of a 16-bit container). ++ * `dst_stride` is in bytes; `src_stride` is bytes per row of NV15 data. ++ */ ++static void v4l2request_nv15_unpack_plane_to_p010(const uint8_t *src, ++ uint16_t *dst, ++ unsigned width, ++ unsigned height, ++ unsigned src_stride, ++ unsigned dst_stride) ++{ ++ for (unsigned y = 0; y < height; y++) { ++ const uint8_t *s = src + y * src_stride; ++ uint16_t *d = (uint16_t *)((uint8_t *)dst + y * dst_stride); ++ unsigned x; ++ ++ for (x = 0; x + 4 <= width; x += 4) { ++ uint16_t a = (uint16_t)s[0] | ((uint16_t)(s[1] & 0x03) << 8); ++ uint16_t b = ((uint16_t)s[1] >> 2) | ((uint16_t)(s[2] & 0x0F) << 6); ++ uint16_t c = ((uint16_t)s[2] >> 4) | ((uint16_t)(s[3] & 0x3F) << 4); ++ uint16_t e = ((uint16_t)s[3] >> 6) | ((uint16_t)s[4] << 2); ++ ++ d[0] = (uint16_t)(a << 6); ++ d[1] = (uint16_t)(b << 6); ++ d[2] = (uint16_t)(c << 6); ++ d[3] = (uint16_t)(e << 6); ++ ++ d += 4; ++ s += 5; ++ } ++ ++ if (x < width) { ++ unsigned rem = width - x; ++ uint16_t pix[4] = { 0, 0, 0, 0 }; ++ ++ pix[0] = (uint16_t)s[0] | ((uint16_t)(s[1] & 0x03) << 8); ++ if (rem >= 2) ++ pix[1] = ((uint16_t)s[1] >> 2) | ((uint16_t)(s[2] & 0x0F) << 6); ++ if (rem >= 3) ++ pix[2] = ((uint16_t)s[2] >> 4) | ((uint16_t)(s[3] & 0x3F) << 4); ++ if (rem >= 4) ++ pix[3] = ((uint16_t)s[3] >> 6) | ((uint16_t)s[4] << 2); ++ ++ for (unsigned j = 0; j < rem; j++) ++ d[j] = (uint16_t)(pix[j] << 6); ++ } ++ } ++} ++ + static int v4l2request_transfer_get_formats(AVHWFramesContext *hwfc, + enum AVHWFrameTransferDirection dir, + enum AVPixelFormat **formats) +@@ -1082,6 +1132,22 @@ static int v4l2request_transfer_get_formats(AVHWFramesContext *hwfc, + if (dir == AV_HWFRAME_TRANSFER_DIRECTION_TO) + return AVERROR(ENOSYS); + ++ /* ++ * NV15-backed surfaces (sw_format = YUV420P10) are exposed as P010 to ++ * downstream filters: the unpack below converts the packed 10-bit ++ * samples into the standard high-bits-of-16 layout. Hi10P / Main10 ++ * VAAPI/v4l2-request decode reaches userspace through this path. ++ */ ++ if (hwfc->sw_format == AV_PIX_FMT_YUV420P10) { ++ fmts = av_malloc_array(2, sizeof(*fmts)); ++ if (!fmts) ++ return AVERROR(ENOMEM); ++ fmts[0] = AV_PIX_FMT_P010; ++ fmts[1] = AV_PIX_FMT_NONE; ++ *formats = fmts; ++ return 0; ++ } ++ + fmts = av_malloc_array(2, sizeof(*fmts)); + if (!fmts) + return AVERROR(ENOMEM); +@@ -1089,8 +1155,13 @@ static int v4l2request_transfer_get_formats(AVHWFramesContext *hwfc, + fmts[0] = hwfc->sw_format; + fmts[1] = AV_PIX_FMT_NONE; + ++ /* ++ * Tiled-NV12-32L32 (Allwinner) and NV20 (rkvdec 4:2:2 10-bit) still need ++ * dedicated unpacks before hwdownload can consume them; leave them as ++ * "no transfer formats" so the filter graph reports the limitation ++ * rather than silently producing garbage. ++ */ + if (hwfc->sw_format == AV_PIX_FMT_YUV420P || +- hwfc->sw_format == AV_PIX_FMT_YUV420P10 || + hwfc->sw_format == AV_PIX_FMT_YUV422P10) + fmts[0] = AV_PIX_FMT_NONE; + +@@ -1110,6 +1181,44 @@ static int v4l2request_transfer_data_from(AVHWFramesContext *hwfc, + map = av_frame_alloc(); + if (!map) + return AVERROR(ENOMEM); ++ ++ /* ++ * For NV15→P010, map the raw NV15 bytes (sw_format) and unpack into ++ * dst's P010 storage. Otherwise fall through to the original byte-copy ++ * path used for 1:1 sw_format matches (NV12, NV16, AFBC handled by DRM). ++ */ ++ if (hwfc->sw_format == AV_PIX_FMT_YUV420P10) { ++ /* ++ * Only P010 is advertised by transfer_get_formats for this sw_format; ++ * a caller that bypasses get_formats and asks for anything else would ++ * silently corrupt output via av_frame_copy on NV15-packed bytes. ++ * Reject explicitly. ++ */ ++ if (dst->format != AV_PIX_FMT_P010) { ++ ret = AVERROR(ENOSYS); ++ goto fail; ++ } ++ ++ map->format = hwfc->sw_format; ++ ret = v4l2request_map_frame(hwfc, map, src); ++ if (ret) ++ goto fail; ++ ++ v4l2request_nv15_unpack_plane_to_p010(map->data[0], ++ (uint16_t *)dst->data[0], ++ dst->width, dst->height, ++ map->linesize[0], ++ dst->linesize[0]); ++ /* NV15 chroma plane is W × H/2 samples (4:2:0, UV interleaved). */ ++ v4l2request_nv15_unpack_plane_to_p010(map->data[1], ++ (uint16_t *)dst->data[1], ++ dst->width, dst->height / 2, ++ map->linesize[1], ++ dst->linesize[1]); ++ ret = 0; ++ goto fail; ++ } ++ + map->format = dst->format; + + ret = v4l2request_map_frame(hwfc, map, src); +-- +2.47.3 + diff --git a/debian/ffmpeg-v4l2-request-fourier/build-deb.sh b/debian/ffmpeg-v4l2-request-fourier/build-deb.sh new file mode 100755 index 000000000..4b708faa3 --- /dev/null +++ b/debian/ffmpeg-v4l2-request-fourier/build-deb.sh @@ -0,0 +1,177 @@ +#!/bin/bash +# Build ffmpeg-v4l2-request-fourier__arm64.deb (the Kwiboo FFmpeg +# fork with the V4L2-Request API hwaccel patches). +# +# Mirror of arch/ffmpeg-v4l2-request-fourier into the Debian tree. +# Provides the patched `ffmpeg` + `ffprobe` binaries plus the shared +# libav* libraries with v4l2-request support, so consumers like +# mpv-fourier (and the kdirect bit-exact reference test rig) work +# end-to-end without a stock-Debian FFmpeg fallback. +# +# Conflicts: ffmpeg, libav* — this is a drop-in replacement. Pi 5 / +# CM5 (BCM2712) hosts using daedalus_v4l2 + libva-v4l2-request-fourier +# DON'T strictly need this package (stock Debian ffmpeg + libva path +# is sufficient for the VAAPI route), but the kdirect bit-exact +# reference + firefox-fourier / mpv-fourier consumers do. +# +# Big build: 25-40 min on a runner. Output is a single .deb that +# bundles ffmpeg/ffprobe + libavcodec.so.61 + libavformat.so.61 etc. +# all together — no split per-library subpackages. Easier to consume, +# trades off finer-grained downgrades. +# +# Sibling Arch package: ../../arch/ffmpeg-v4l2-request-fourier/PKGBUILD +# Upstream: https://github.com/Kwiboo/FFmpeg (branch v4l2-request-n8.1) +set -euo pipefail + +# Same pin as arch/ — v4l2-request-n8.1 tip 2026-04-24. +UPSTREAM_COMMIT=b57fbbe50c9b2656fad86a1a7eeabfd2b2a50935 +FFMPEG_VERSION=8.1 +# epoch 2 matches Debian's stock ffmpeg (currently 7:7.1.x in trixie); +# +rfourier suffix to avoid colliding with upstream/Debian rebuilds. +PKGVER=2:${FFMPEG_VERSION}+rfourier+gb57fbbe +PKGREL=1 + +HERE=$(dirname "$(readlink -f "$0")") + +# Reproducible build. 2026-05-18 23:00 UTC — Phase 8.13 close. +export SOURCE_DATE_EPOCH=1779231600 + +work=$(mktemp -d) +trap "rm -rf $work" EXIT + +cd "$work" +git clone --depth 1 \ + --branch v4l2-request-n8.1 \ + https://github.com/Kwiboo/FFmpeg.git FFmpeg +cd FFmpeg +# git fetch the specific commit (depth=1 of branch tip might not be it) +if [ "$(git rev-parse HEAD)" != "$UPSTREAM_COMMIT" ]; then + git fetch origin "$UPSTREAM_COMMIT" + git checkout "$UPSTREAM_COMMIT" +fi + +# Apply patches (same as Arch). +patch -Np1 -i "$HERE/0001-libudev-bypass-fallback.patch" +patch -Np1 -i "$HERE/0002-nv15-to-p010-unpack.patch" + +# Configure with Arch-parity flags. Drops the same set of features +# (X11, AMF, CUDA, FireWire, AviSynth, Bluray, OpenMPT, JPEG-XL, +# Theora, XVid, rsvg, soxr, ssh, vidstab, modplug, SDL2, Vulkan, +# JACK, GSM, Speex) — not needed on the Fourier fleet, keeps the .deb +# smaller and the dependency graph tighter. +./configure \ + --prefix=/usr \ + --libdir=/usr/lib/aarch64-linux-gnu \ + --shlibdir=/usr/lib/aarch64-linux-gnu \ + --incdir=/usr/include/aarch64-linux-gnu \ + --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 -j"$(nproc)" +make tools/qt-faststart + +# Stage +ROOT="$work/pkgroot" +make DESTDIR="$ROOT" install +install -Dm755 tools/qt-faststart "$ROOT/usr/bin/qt-faststart" + +# Doc +mkdir -p "$ROOT/usr/share/doc/ffmpeg-v4l2-request-fourier" "$ROOT/DEBIAN" +install -Dm644 "$HERE/debian/copyright" \ + "$ROOT/usr/share/doc/ffmpeg-v4l2-request-fourier/copyright" +install -Dm644 "$HERE/debian/changelog" \ + "$ROOT/usr/share/doc/ffmpeg-v4l2-request-fourier/changelog.Debian" +gzip -9 -n "$ROOT/usr/share/doc/ffmpeg-v4l2-request-fourier/changelog.Debian" + +cat > "$ROOT/DEBIAN/control" < +Homepage: https://github.com/Kwiboo/FFmpeg +Description: FFmpeg with V4L2 Request API hwaccel (Kwiboo fork) + FFmpeg ${FFMPEG_VERSION} patched with the V4L2 Request API stateless + video decoder hwaccel — Kwiboo's long-running rebase of Jernej + Škrabec's v4l2-request patchset onto FFmpeg release tags. + . + Provides 'ffmpeg -hwaccel v4l2request' / '-hwaccel drm' routes that + drive rkvdec / hantro / cedrus / rpi-hevc-dec / daedalus_v4l2 + stateless decoders directly through libavcodec's hwdevice DRM path, + bypassing libva. Used by mpv-fourier and firefox-fourier as their + backing FFmpeg, and as the kdirect bit-exact reference in libva-v4l2- + request-fourier validation. + . + Drops X11/AMF/CUDA/Bluray/JACK/Vulkan/SDL2/Theora/XVid/Speex/JPEG-XL + per Fourier fleet policy (Wayland + ARM + video-decode focus). + No 'ffplay' binary; mpv-fourier covers interactive playback. +EOF + +DEB_OUT="ffmpeg-v4l2-request-fourier_${PKGVER//:/%3a}-${PKGREL}_arm64.deb" +dpkg-deb --root-owner-group --build "$ROOT" "$HERE/$DEB_OUT" +echo "built: $HERE/$DEB_OUT" diff --git a/debian/ffmpeg-v4l2-request-fourier/debian/changelog b/debian/ffmpeg-v4l2-request-fourier/debian/changelog new file mode 100644 index 000000000..a9dde177d --- /dev/null +++ b/debian/ffmpeg-v4l2-request-fourier/debian/changelog @@ -0,0 +1,14 @@ +ffmpeg-v4l2-request-fourier (2:8.1+rfourier+gb57fbbe-1) bookworm trixie; urgency=medium + + * Initial Debian packaging for the Kwiboo FFmpeg fork with V4L2 + Request API hwaccel patches. + * Mirror of arch/ffmpeg-v4l2-request-fourier (same pin b57fbbe, + same configure flags, same 2 patches: libudev-bypass-fallback + + nv15-to-p010-unpack). + * Drop-in replacement for Debian's stock ffmpeg + libav*; takes + epoch 2 to win the apt version comparison. + * Required by mpv-fourier and firefox-fourier; not strictly + required for the VAAPI-only path on daedalus-v4l2 hosts (stock + libva + Debian ffmpeg works there). + + -- Markus Fritsche Mon, 18 May 2026 23:00:00 +0000 diff --git a/debian/ffmpeg-v4l2-request-fourier/debian/control b/debian/ffmpeg-v4l2-request-fourier/debian/control new file mode 100644 index 000000000..f1a68243d --- /dev/null +++ b/debian/ffmpeg-v4l2-request-fourier/debian/control @@ -0,0 +1,61 @@ +Source: ffmpeg-v4l2-request-fourier +Section: video +Priority: optional +Maintainer: Markus Fritsche +Build-Depends: debhelper-compat (= 13), + git, + nasm, + pkg-config, + libass-dev, + libdrm-dev, + libfontconfig1-dev, + libfreetype6-dev, + libfribidi-dev, + libgnutls28-dev, + libmp3lame-dev, + libopus-dev, + libpulse-dev, + libudev-dev, + libv4l-dev, + libva-dev, + libvorbis-dev, + libvpx-dev, + libwebp-dev, + libx264-dev, + libx265-dev, + libxml2-dev, + libdav1d-dev, + linux-libc-dev +Standards-Version: 4.6.2 +Homepage: https://github.com/Kwiboo/FFmpeg + +Package: ffmpeg-v4l2-request-fourier +Architecture: arm64 +Depends: ${misc:Depends}, ${shlibs:Depends} +Conflicts: ffmpeg, + libavcodec61, libavformat61, libavutil59, + libswresample5, libswscale8, libavdevice61, libavfilter10, + libpostproc58 +Replaces: ffmpeg, + libavcodec61, libavformat61, libavutil59, + libswresample5, libswscale8, libavdevice61, libavfilter10, + libpostproc58 +Provides: ffmpeg (= ${binary:Version}), + libavcodec.so.61, + libavformat.so.61, + libavutil.so.59 +Description: FFmpeg with V4L2 Request API hwaccel (Kwiboo fork) + FFmpeg 8.1 patched with the V4L2 Request API stateless video decoder + hwaccel — Kwiboo's long-running rebase of Jernej Škrabec's + v4l2-request patchset onto FFmpeg release tags. + . + Provides 'ffmpeg -hwaccel v4l2request' / '-hwaccel drm' routes that + drive rkvdec / hantro / cedrus / rpi-hevc-dec / daedalus_v4l2 + stateless decoders directly through libavcodec's hwdevice DRM path, + bypassing libva. Used by mpv-fourier and firefox-fourier as their + backing FFmpeg, and as the kdirect bit-exact reference in + libva-v4l2-request-fourier validation. + . + Drops X11/AMF/CUDA/Bluray/JACK/Vulkan/SDL2/Theora/XVid/Speex/JPEG-XL + per Fourier fleet policy (Wayland + ARM + video-decode focus). No + 'ffplay' binary; mpv-fourier covers interactive playback. diff --git a/debian/ffmpeg-v4l2-request-fourier/debian/copyright b/debian/ffmpeg-v4l2-request-fourier/debian/copyright new file mode 100644 index 000000000..22df13700 --- /dev/null +++ b/debian/ffmpeg-v4l2-request-fourier/debian/copyright @@ -0,0 +1,21 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: FFmpeg (Kwiboo v4l2-request fork) +Upstream-Contact: Niklas Haas , Jernej Škrabec, Kwiboo +Source: https://github.com/Kwiboo/FFmpeg + +Files: * +Copyright: 2000-2026 The FFmpeg developers +License: GPL-3.0-or-later + +Files: 0001-libudev-bypass-fallback.patch 0002-nv15-to-p010-unpack.patch +Copyright: 2024-2026 Markus Fritsche +License: GPL-3.0-or-later + +License: GPL-3.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 3 of the License, or + (at your option) any later version. + . + On Debian systems, the complete text of the GNU General Public + License v3 can be found in `/usr/share/common-licenses/GPL-3'.