From 22ac3c9845ed03a85fe1c4b897465b9e7191be66 Mon Sep 17 00:00:00 2001 From: Markus Fritsche Date: Thu, 21 May 2026 06:59:20 +0200 Subject: [PATCH] firefox-fourier 0003: V4L2REQUEST type acceptance (proper patch, regenerated from real source) Closes #60. Resolves the malformed-patch issue from #61 (since reverted in #62) by regenerating the 0003 patch via actual application against firefox 150.0.3 Pi-OS source. Functional change vs prior 0003: walking hw_configs accepts AV_HWDEVICE_TYPE_DRM (legacy) OR integer device_type values 13/14 (AV_HWDEVICE_TYPE_V4L2REQUEST in Kwibos no-AMF / upstream-AMF trees). CreateV4L2RequestDeviceContext passes integer 13 (Kwibos value) cast to enum AVHWDeviceType for the av_hwdevice_ctx_create call. Tested: applied cleanly via patch -p1 against firefox-150.0.3 source post-Pi-OS-quilt-patches. Test build follow-up in firefox-rpios EC2 script (drops the in-source sed hack from v7-v8). --- .../0003-ffmpegvideo-v4l2-request-route.patch | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/arch/firefox-fourier/0003-ffmpegvideo-v4l2-request-route.patch b/arch/firefox-fourier/0003-ffmpegvideo-v4l2-request-route.patch index c02f97bdf..259028f37 100644 --- a/arch/firefox-fourier/0003-ffmpegvideo-v4l2-request-route.patch +++ b/arch/firefox-fourier/0003-ffmpegvideo-v4l2-request-route.patch @@ -18,27 +18,30 @@ This patch adds a sibling init path, `InitV4L2RequestDecoder`, that: * looks up the codec via two complementary mechanisms libavcodec uses for v4l2_request: - **named codec** (`h264_v4l2request`, `vp8_v4l2request`, etc.): - the legacy AVCodec-per-hwaccel registration. ALARM, Debian, - and most distros building with --enable-v4l2-request expose - this (avcodec_find_decoder_by_name lookup). - - **generic codec + AV_HWDEVICE_TYPE_DRM** in `hw_configs`: - the modern hwaccel registration on some upstream-only ffmpeg - builds. + the legacy AVCodec-per-hwaccel registration. + - **generic codec + hw_configs walk**: the modern hwaccel + registration. Accepts EITHER AV_HWDEVICE_TYPE_DRM (legacy + ffmpeg-v4l2-request-fork output prior to FFmpeg 7.1) OR + AV_HWDEVICE_TYPE_V4L2REQUEST (FFmpeg 7.1+ dedicated enum, + value 13 on Kwiboo's no-AMF tree, 14 on upstream-AMF tree). + Mozilla's bundled libavutil headers may not have the V4L2REQUEST + enumerator, so the test is on the integer value via `(int)cast`. Probes named-codec first (explicit, portable) and falls back to - walking the generic codec's `hw_configs` for the DRM device type; - * creates an `AV_HWDEVICE_TYPE_DRM` hwdevice context bound to - `/dev/dri/renderD128` via the new `av_hwdevice_ctx_create` wrapper - (patch 2/4) and attaches it to the codec context; + walking the generic codec's `hw_configs` for either device type; + * creates an hwdevice context bound to `/dev/dri/renderD128`. Uses + integer 13 (V4L2REQUEST as defined by Kwiboo's v4l2-request-n7.1.3 + tree, what our libavcodec61-fourier emits) cast to enum + AVHWDeviceType for the av_hwdevice_ctx_create call; * reuses the existing `ChooseV4L2PixelFormat` get-format callback (already returns `AV_PIX_FMT_DRM_PRIME`) and the existing `apply_cropping = 0` constraint. `InitV4L2RequestDecoder` is invoked **before** `InitV4L2Decoder` in `InitHWDecoderIfAllowed`. On Rockchip mainline it succeeds via either -mechanism (ALARM uses the named codec). On Pi4 / Mediatek / -vendor-MPP-stateful boards neither mechanism is registered for the -codec, the function bails out, and the existing stateful -`InitV4L2Decoder` runs as before. No regression of stateful boards. +mechanism. On Pi4 / Mediatek / vendor-MPP-stateful boards neither +mechanism is registered for the codec, the function bails out, and the +existing stateful `InitV4L2Decoder` runs as before. No regression of +stateful boards. `mDRMDeviceContext` is unconditionally `av_buffer_unref`'d in `ProcessShutdown` (no-op when null). Gated behind @@ -46,9 +49,8 @@ codec, the function bails out, and the existing stateful Bug 1969297. -diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h ---- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h 2026-03-18 19:22:14.000000000 +0000 -+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h 2026-04-27 20:43:39.347992674 +0000 +--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h 2026-05-21 04:57:59.570946601 +0000 ++++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h 2026-05-21 04:57:59.876488776 +0000 @@ -225,7 +225,12 @@ bool IsLinuxHDR() const; MediaResult InitVAAPIDecoder(); @@ -73,9 +75,8 @@ diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h b/dom/media/platfor // If video overlay is used we want to upload SW decoded frames to // DMABuf and present it as a external texture to rendering pipeline. bool mUploadSWDecodeToDMABuf = false; -diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp ---- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp 2026-04-27 16:09:10.000000000 +0200 -+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp 2026-04-29 00:10:00.098884335 +0200 +--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp 2026-05-21 04:57:59.566685221 +0000 ++++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp 2026-05-21 04:58:00.136004159 +0000 @@ -403,6 +403,129 @@ return NS_OK; } @@ -90,7 +91,7 @@ diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platf + } + const char* drmDevice = "/dev/dri/renderD128"; + if (mLib->av_hwdevice_ctx_create(&mDRMDeviceContext, -+ AV_HWDEVICE_TYPE_DRM, drmDevice, ++ (enum AVHWDeviceType)13, drmDevice, + nullptr, 0) < 0) { + FFMPEG_LOG(" av_hwdevice_ctx_create(DRM, %s) failed", drmDevice); + return false; @@ -143,7 +144,7 @@ diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platf + for (int i = 0;; i++) { + const AVCodecHWConfig* cfg = mLib->avcodec_get_hw_config(generic, i); + if (!cfg) break; -+ if (cfg->device_type == AV_HWDEVICE_TYPE_DRM) { ++ if (cfg->device_type == AV_HWDEVICE_TYPE_DRM || (int)cfg->device_type == 13 || (int)cfg->device_type == 14) { + codec = generic; + FFMPEG_LOG(" using generic codec %s with DRM hwaccel", codec->name); + break;