debian/ffmpeg-v4l2-request-fourier: new package
Mirror of arch/ffmpeg-v4l2-request-fourier into the Debian tree. Same source pin (Kwiboo v4l2-request-n8.1 @ b57fbbe), same 2 patches (libudev-bypass-fallback + nv15-to-p010-unpack), same configure flag policy (drop X11/AMF/CUDA/Bluray/Vulkan/SDL2/etc. per Fourier fleet focus). Output: single .deb at /usr/bin/ffmpeg + /usr/bin/ffprobe + /usr/lib/aarch64-linux-gnu/libav*.so.61. Conflicts/Replaces the stock Debian ffmpeg + per-lib packages; takes epoch 2 (matches Debian's existing ffmpeg epoch). Provides 'ffmpeg -hwaccel v4l2request' + '-hwaccel drm' routes that drive rkvdec / hantro / cedrus / rpi-hevc-dec / daedalus_v4l2 stateless decoders through libavcodec's hwdevice DRM path, bypassing libva. Required by mpv-fourier and firefox-fourier as their backing FFmpeg; also the kdirect bit-exact reference for libva-v4l2-request-fourier validation. NOT strictly required for the VAAPI-only path on daedalus-v4l2 hosts (stock Debian ffmpeg + libva-v4l2-request- fourier covers that). Install only when going firefox-fourier or kdirect. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,166 @@
|
|||||||
|
--- a/libavutil/hwcontext_v4l2request.c
|
||||||
|
+++ b/libavutil/hwcontext_v4l2request.c
|
||||||
|
@@ -19,12 +19,13 @@
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <linux/dma-buf.h>
|
||||||
|
#include <linux/media.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
+#include <sys/stat.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <drm_fourcc.h>
|
||||||
|
#include <libudev.h>
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
From 0cd6e669735e453ec8772f111065bbb2f70a5bc6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Markus Fritsche <mfritsche@reauktion.de>
|
||||||
|
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
|
||||||
|
|
||||||
+177
@@ -0,0 +1,177 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Build ffmpeg-v4l2-request-fourier_<ver>_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" <<EOF
|
||||||
|
Package: ffmpeg-v4l2-request-fourier
|
||||||
|
Version: ${PKGVER}-${PKGREL}
|
||||||
|
Section: video
|
||||||
|
Priority: optional
|
||||||
|
Architecture: arm64
|
||||||
|
Depends: libc6,
|
||||||
|
libdrm2,
|
||||||
|
libfontconfig1,
|
||||||
|
libfreetype6,
|
||||||
|
libfribidi0,
|
||||||
|
libxml2,
|
||||||
|
libpulse0,
|
||||||
|
libdav1d7 | libdav1d6,
|
||||||
|
libopus0,
|
||||||
|
libvorbis0a,
|
||||||
|
libvorbisenc2,
|
||||||
|
libmp3lame0,
|
||||||
|
libvpx9 | libvpx8 | libvpx7,
|
||||||
|
libx264-164 | libx264-163,
|
||||||
|
libx265-215 | libx265-209 | libx265-199,
|
||||||
|
libwebp7 | libwebp6,
|
||||||
|
libwebpmux3,
|
||||||
|
libass9,
|
||||||
|
libgnutls30,
|
||||||
|
libudev1,
|
||||||
|
libv4l-0,
|
||||||
|
libva2,
|
||||||
|
libva-drm2
|
||||||
|
Conflicts: ffmpeg, libavcodec61, libavformat61, libavutil59,
|
||||||
|
libswresample5, libswscale8, libavdevice61, libavfilter10,
|
||||||
|
libpostproc58
|
||||||
|
Replaces: ffmpeg, libavcodec61, libavformat61, libavutil59,
|
||||||
|
libswresample5, libswscale8, libavdevice61, libavfilter10,
|
||||||
|
libpostproc58
|
||||||
|
Provides: ffmpeg (= ${PKGVER}-${PKGREL}),
|
||||||
|
libavcodec.so.61,
|
||||||
|
libavformat.so.61,
|
||||||
|
libavutil.so.59
|
||||||
|
Maintainer: Markus Fritsche <mfritsche@reauktion.de>
|
||||||
|
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"
|
||||||
@@ -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 <mfritsche@reauktion.de> Mon, 18 May 2026 23:00:00 +0000
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
Source: ffmpeg-v4l2-request-fourier
|
||||||
|
Section: video
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: Markus Fritsche <mfritsche@reauktion.de>
|
||||||
|
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.
|
||||||
@@ -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 <niklas@haasn.dev>, 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 <fritsche.markus@gmail.com>
|
||||||
|
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'.
|
||||||
Reference in New Issue
Block a user