Files
jellyfin-ffmpeg/debian/patches/0038-allow-vaapi-import-drm-prime2-planar-formats.patch
T
2026-05-28 10:53:47 +08:00

63 lines
2.3 KiB
Diff

Index: FFmpeg/libavutil/hwcontext_vaapi.c
===================================================================
--- FFmpeg.orig/libavutil/hwcontext_vaapi.c
+++ FFmpeg/libavutil/hwcontext_vaapi.c
@@ -170,6 +170,9 @@ static const VAAPIFormatDescriptor vaapi
#ifdef VA_FOURCC_X2R10G10B10
MAP(X2R10G10B10, RGB32_10, X2RGB10, 0),
#endif
+#ifdef VA_FOURCC_X2B10G10R10
+ MAP(X2B10G10R10, RGB32_10, X2BGR10, 0),
+#endif
#ifdef VA_FOURCC_Y410
// libva doesn't include a fourcc for XV30 and the driver only declares
// support for Y410, so we must fudge the mapping here.
@@ -1047,9 +1050,11 @@ static const struct {
DRM_MAP(NV12, 1, DRM_FORMAT_NV12),
#if defined(VA_FOURCC_P010) && defined(DRM_FORMAT_R16)
DRM_MAP(P010, 2, DRM_FORMAT_R16, DRM_FORMAT_RG1616),
+ DRM_MAP(P010, 2, DRM_FORMAT_R16, DRM_FORMAT_GR1616),
#endif
#if defined(VA_FOURCC_P012) && defined(DRM_FORMAT_R16)
DRM_MAP(P012, 2, DRM_FORMAT_R16, DRM_FORMAT_RG1616),
+ DRM_MAP(P012, 2, DRM_FORMAT_R16, DRM_FORMAT_GR1616),
#endif
DRM_MAP(BGRA, 1, DRM_FORMAT_ARGB8888),
DRM_MAP(BGRX, 1, DRM_FORMAT_XRGB8888),
@@ -1073,6 +1078,9 @@ static const struct {
#if defined(VA_FOURCC_X2R10G10B10) && defined(DRM_FORMAT_XRGB2101010)
DRM_MAP(X2R10G10B10, 1, DRM_FORMAT_XRGB2101010),
#endif
+#if defined(VA_FOURCC_X2B10G10R10) && defined(DRM_FORMAT_XBGR2101010)
+ DRM_MAP(X2B10G10R10, 1, DRM_FORMAT_XBGR2101010),
+#endif
};
#undef DRM_MAP
@@ -1128,12 +1136,6 @@ static int vaapi_map_from_drm(AVHWFrames
desc = (AVDRMFrameDescriptor*)src->data[0];
- if (desc->nb_objects != 1) {
- av_log(dst_fc, AV_LOG_ERROR, "VAAPI can only map frames "
- "made from a single DRM object.\n");
- return AVERROR(EINVAL);
- }
-
va_fourcc = 0;
for (i = 0; i < FF_ARRAY_ELEMS(vaapi_drm_format_map); i++) {
if (desc->nb_layers != vaapi_drm_format_map[i].nb_layer_formats)
@@ -1273,6 +1275,12 @@ static int vaapi_map_from_drm(AVHWFrames
buffer_attrs, FF_ARRAY_ELEMS(buffer_attrs));
}
#else
+ if (desc->nb_objects != 1) {
+ av_log(dst_fc, AV_LOG_ERROR, "VAAPI can only map frames "
+ "made from a single DRM object.\n");
+ return AVERROR(EINVAL);
+ }
+
buffer_handle = desc->objects[0].fd;
buffer_desc.pixel_format = va_fourcc;
buffer_desc.width = src_fc->width;