iter2 step3: HEVC EXT_SPS_*_RPS UAPI header + runtime probe
src/hevc-ctrls/v4l2-hevc-ext-controls.h (NEW, MIT, ~95 LOC):
Verbatim mirror of Linux 7.0 V4L2_CID_STATELESS_HEVC_EXT_SPS_ST_RPS
and _LT_RPS control IDs + struct definitions + flag macros. Each
symbol is ifndef-guarded so when ampere's linux-api-headers
eventually bumps to 7.0+, the kernel header takes precedence and
this shim silently no-ops. Citation block links the upstream
Casanova v8 series.
Per LGPL section 3.b, kernel UAPI struct definitions are excepted
from GPL inheritance, so copying them into MIT userspace is fine.
src/request.h: added has_hevc_ext_sps_rps_rkvdec + _hantro bool
fields on struct request_data — pair-of-flags layout mirrors
video_fd_rkvdec / video_fd_hantro (iter38 multi-device-probe
pattern, per feedback_multi_device_probe_design). Phase 5 review
identified single-scalar storage as a silent-misbehavior risk
across device-switch boundaries.
src/request.c:
- new probe_hevc_ext_sps_rps_controls(fd) helper: queries the two
new CIDs via VIDIOC_QUERYCTRL; returns true iff both register.
RK3399 rkvdec (linux 6.x or 7.x without VDPU381/383 bindings)
returns false; RK3588 rkvdec (VDPU381/383) returns true.
- probe each driver_data->video_fd_rkvdec / _hantro after the
iter38 multi-device-probe block at VA_DRIVER_INIT time
- log-line if rkvdec supports it - diagnostic for Phase 7
src/meson.build: added the new UAPI header to the headers list.
Build verified: ninja -C build clean, .so produced. The new probe
runs at driver init and stores the result, but nothing CONSUMES the
result yet — that's Step 4 (h265_set_controls wiring).
Per ampere-kernel-decoders campaign iter2 Phase 4 step 3 (amended
by Phase 5 review item 'per-fd storage').
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -57,6 +57,8 @@
|
||||
#include <linux/media.h>
|
||||
#include <linux/videodev2.h>
|
||||
|
||||
#include "hevc-ctrls/v4l2-hevc-ext-controls.h"
|
||||
|
||||
/*
|
||||
* fresnel-fourier iter4 Phase 6 commit Z + iter7 Phase 6 (B1a): device-path
|
||||
* auto-detect via media controller topology with decoder-entity discrimination.
|
||||
@@ -286,6 +288,43 @@ out:
|
||||
* - non-NULL → match only that exact driver name
|
||||
* - NULL → match any name in known_decoder_drivers[]
|
||||
*/
|
||||
/*
|
||||
* iter2 (ampere-kernel-decoders campaign) — runtime probe for the
|
||||
* V4L2 stateless HEVC EXT_SPS_{ST,LT}_RPS controls added in
|
||||
* Linux 7.0 (Casanova VDPU381/VDPU383 series). Returns true iff BOTH
|
||||
* controls are registered on the given fd. Stored per-fd on
|
||||
* driver_data so the multi-device-probe model (iter38) doesn't
|
||||
* silently misbehave when codec routing switches devices.
|
||||
*
|
||||
* The two CIDs together are the gate — neither alone is meaningful
|
||||
* without the other (st-RPS + lt-RPS arrays both need to be set to
|
||||
* match the SPS num_short_term_ref_pic_sets / num_long_term_ref_pics_sps
|
||||
* counts). Old kernels (RK3399 rkvdec on linux 6.x) register neither;
|
||||
* RK3588 rkvdec (VDPU381/383 path) registers both.
|
||||
*
|
||||
* Reference: phase4_plan_iter2.md §Step 3 in
|
||||
* ~/src/ampere-kernel-decoders/.
|
||||
*/
|
||||
static bool probe_hevc_ext_sps_rps_controls(int video_fd)
|
||||
{
|
||||
struct v4l2_queryctrl q;
|
||||
|
||||
if (video_fd < 0)
|
||||
return false;
|
||||
|
||||
memset(&q, 0, sizeof(q));
|
||||
q.id = V4L2_CID_STATELESS_HEVC_EXT_SPS_ST_RPS;
|
||||
if (ioctl(video_fd, VIDIOC_QUERYCTRL, &q) < 0)
|
||||
return false;
|
||||
|
||||
memset(&q, 0, sizeof(q));
|
||||
q.id = V4L2_CID_STATELESS_HEVC_EXT_SPS_LT_RPS;
|
||||
if (ioctl(video_fd, VIDIOC_QUERYCTRL, &q) < 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int find_decoder_device_by_driver(const char *want_driver,
|
||||
char *video_out, size_t video_out_sz,
|
||||
char *media_out, size_t media_out_sz)
|
||||
@@ -644,6 +683,22 @@ VAStatus VA_DRIVER_INIT_FUNC(VADriverContextP context)
|
||||
(void)primary_driver;
|
||||
}
|
||||
|
||||
/*
|
||||
* iter2 (ampere-kernel-decoders): probe the new HEVC EXT_SPS_RPS
|
||||
* controls on each rkvdec/hantro fd. Result is consumed by
|
||||
* h265_set_controls per-codec gate. Per-fd storage matches the
|
||||
* iter38 multi-device-probe pattern (Phase 5 review item).
|
||||
*/
|
||||
driver_data->has_hevc_ext_sps_rps_rkvdec =
|
||||
probe_hevc_ext_sps_rps_controls(driver_data->video_fd_rkvdec);
|
||||
driver_data->has_hevc_ext_sps_rps_hantro =
|
||||
probe_hevc_ext_sps_rps_controls(driver_data->video_fd_hantro);
|
||||
if (driver_data->has_hevc_ext_sps_rps_rkvdec) {
|
||||
request_log("iter2: kernel registers HEVC EXT_SPS_{ST,LT}_RPS "
|
||||
"controls on rkvdec fd (will route through "
|
||||
"vendored GStreamer parser)\n");
|
||||
}
|
||||
|
||||
status = VA_STATUS_SUCCESS;
|
||||
goto complete;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user