[vlc-commits] [Git][videolan/vlc][master] 5 commits: directx_va: map 422/444 HEVC GUIDs
Steve Lhomme (@robUx4)
gitlab at videolan.org
Thu Apr 2 13:52:54 UTC 2026
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
7fb38770 by Steve Lhomme at 2026-04-02T13:12:41+00:00
directx_va: map 422/444 HEVC GUIDs
- - - - -
d38a761a by Steve Lhomme at 2026-04-02T13:12:41+00:00
directx_va: log which chroma is not supported
- - - - -
e01fed9b by Steve Lhomme at 2026-04-02T13:12:41+00:00
contrib: ffmpeg: replace Intel HEVC 422/444 support by the Microsoft one
>From this Merge Request [^1].
The Intel workaround is not made public anymore and we don't check it since 0dd67938c02ed9a6cfe3f17fe314bc3c99998fae.
As long as we built with our custom FFmpeg it's fine. But as soon as the actual
HEVC Rext support is added it will detect it incorrectly and fail to decode
some GPUs.
Intel has added support for the MS GUIDs (with the matching code), as well as
NVIDIA and AMD. So we should use that one instead.
On Intel GPU the support may depend on the driver version. My Windows 10 machine
does have drivers with the Microsoft GUIDs support.
[^1]: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20334
- - - - -
25fbeb34 by Steve Lhomme at 2026-04-02T13:12:41+00:00
directx_va: remove support for unused custom FFmpeg patch
We still list the GUIDs we know with a fancy name.
- - - - -
abe84d61 by Steve Lhomme at 2026-04-02T13:12:41+00:00
configure: fix error when mingw-w64 version is too old
Missing from e5725fe5cd0f6a0220d247312ee4089f6f9f1e73.
- - - - -
7 changed files:
- configure.ac
- + contrib/src/ffmpeg/0001-avcodec-dxva2-add-support-for-HEVC-RExt-DXVA-profile.patch
- − contrib/src/ffmpeg/0001-avcodec-dxva2_hevc-add-support-for-parsing-HEVC-Rang.patch
- − contrib/src/ffmpeg/0002-avcodec-hevcdec-allow-HEVC-444-8-10-12-bits-decoding.patch
- − contrib/src/ffmpeg/0003-avcodec-hevcdec-allow-HEVC-422-10-12-bits-decoding-w.patch
- contrib/src/ffmpeg/rules.mak
- modules/codec/avcodec/directx_va.c
Changes:
=====================================
configure.ac
=====================================
@@ -732,7 +732,7 @@ dnl Check for broken versions of mingw-runtime compatibility library
AC_MSG_RESULT([ok])
], [
AC_MSG_RESULT([present])
- AC_MSG_ERROR([LibVLC requires Mingw-w64 version 6.0 or higher!])
+ AC_MSG_ERROR([LibVLC requires Mingw-w64 version 8.0 or higher!])
])
AS_IF([test "${win_ucrt_build}" = "no"], [
=====================================
contrib/src/ffmpeg/0001-avcodec-dxva2-add-support-for-HEVC-RExt-DXVA-profile.patch
=====================================
@@ -0,0 +1,555 @@
+From 148c133ace31e8c8ff12db101ff052c7569b926d Mon Sep 17 00:00:00 2001
+From: Cameron Gutman <aicommander at gmail.com>
+Date: Sun, 24 Aug 2025 21:23:34 -0500
+Subject: [PATCH] avcodec/dxva2: add support for HEVC RExt DXVA profiles
+
+Microsoft has formally standardized DXVA GUIDs for HEVC Range Extension
+profiles in the Windows 11 24H2 SDK. They are supported by Intel GPUs
+starting with Tiger Lake.
+
+Like VDPAU and VAAPI, DXVA has separate GUIDs for each RExt profile, so
+we must parse the SPS like those hwaccels do to figure out which one to
+use when creating our decoder.
+
+The new RExt profiles are supported with DXVA2 and D3D11VA (depending on
+driver support).
+
+Signed-off-by: Cameron Gutman <aicommander at gmail.com>
+---
+ libavcodec/Makefile | 6 +-
+ libavcodec/d3d12va_hevc.c | 11 +++-
+ libavcodec/dxva2.c | 77 +++++++++++++++++++++---
+ libavcodec/dxva2_hevc.c | 115 ++++++++++++++++++++++++++++++++++--
+ libavcodec/dxva2_internal.h | 47 ++++++++++++++-
+ libavcodec/hevc/hevcdec.c | 40 +++++++++++++
+ 6 files changed, 276 insertions(+), 20 deletions(-)
+
+diff --git a/libavcodec/Makefile b/libavcodec/Makefile
+index 12a8265025..363119f38f 100644
+--- a/libavcodec/Makefile
++++ b/libavcodec/Makefile
+@@ -1067,9 +1067,9 @@ OBJS-$(CONFIG_H264_VAAPI_HWACCEL) += vaapi_h264.o
+ OBJS-$(CONFIG_H264_VDPAU_HWACCEL) += vdpau_h264.o
+ OBJS-$(CONFIG_H264_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
+ OBJS-$(CONFIG_H264_VULKAN_HWACCEL) += vulkan_decode.o vulkan_h264.o
+-OBJS-$(CONFIG_HEVC_D3D11VA_HWACCEL) += dxva2_hevc.o
+-OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL) += dxva2_hevc.o
+-OBJS-$(CONFIG_HEVC_D3D12VA_HWACCEL) += dxva2_hevc.o d3d12va_hevc.o
++OBJS-$(CONFIG_HEVC_D3D11VA_HWACCEL) += dxva2_hevc.o h265_profile_level.o
++OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL) += dxva2_hevc.o h265_profile_level.o
++OBJS-$(CONFIG_HEVC_D3D12VA_HWACCEL) += dxva2_hevc.o d3d12va_hevc.o h265_profile_level.o
+ OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL) += nvdec_hevc.o
+ OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec.o
+ OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL) += vaapi_hevc.o h265_profile_level.o
+diff --git a/libavcodec/d3d12va_hevc.c b/libavcodec/d3d12va_hevc.c
+index e72d49b7d9..13adc5f443 100644
+--- a/libavcodec/d3d12va_hevc.c
++++ b/libavcodec/d3d12va_hevc.c
+@@ -33,7 +33,10 @@
+ #define MAX_SLICES 256
+
+ typedef struct HEVCDecodePictureContext {
+- DXVA_PicParams_HEVC pp;
++ union {
++ DXVA_PicParams_HEVC pp;
++ ff_DXVA_PicParams_HEVC_RangeExt ppext;
++ };
+ DXVA_Qmatrix_HEVC qm;
+ unsigned slice_count;
+ DXVA_Slice_HEVC_Short slice_short[MAX_SLICES];
+@@ -65,7 +68,7 @@ static int d3d12va_hevc_start_frame(AVCodecContext *avctx,
+
+ ctx->used_mask = 0;
+
+- ff_dxva2_hevc_fill_picture_parameters(avctx, (AVDXVAContext *)ctx, &ctx_pic->pp);
++ ff_dxva2_hevc_fill_picture_parameters(avctx, (AVDXVAContext *)ctx, &ctx_pic->ppext);
+
+ ff_dxva2_hevc_fill_scaling_lists(avctx, (AVDXVAContext *)ctx, &ctx_pic->qm);
+
+@@ -155,11 +158,13 @@ static int d3d12va_hevc_end_frame(AVCodecContext *avctx)
+ HEVCDecodePictureContext *ctx_pic = h->cur_frame->hwaccel_picture_private;
+
+ int scale = ctx_pic->pp.dwCodingParamToolFlags & 1;
++ int rext = avctx->profile == AV_PROFILE_HEVC_REXT;
+
+ if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0)
+ return -1;
+
+- return ff_d3d12va_common_end_frame(avctx, h->cur_frame->f, &ctx_pic->pp, sizeof(ctx_pic->pp),
++ return ff_d3d12va_common_end_frame(avctx, h->cur_frame->f, &ctx_pic->pp,
++ rext ? sizeof(ctx_pic->ppext) : sizeof(ctx_pic->pp),
+ scale ? &ctx_pic->qm : NULL, scale ? sizeof(ctx_pic->qm) : 0, update_input_arguments);
+ }
+
+diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
+index a282e6c0c7..217d63dce1 100644
+--- a/libavcodec/dxva2.c
++++ b/libavcodec/dxva2.c
+@@ -48,7 +48,6 @@ DEFINE_GUID(ff_DXVA2_ModeVP9_VLD_Profile0,0x463707f8,0xa1d0,0x4585,0x87,0x6d,0x8
+ DEFINE_GUID(ff_DXVA2_ModeVP9_VLD_10bit_Profile2,0xa4c749ef,0x6ecf,0x48aa,0x84,0x48,0x50,0xa7,0xa1,0x16,0x5f,0xf7);
+ DEFINE_GUID(ff_DXVA2_ModeAV1_VLD_Profile0,0xb8be4ccb,0xcf53,0x46ba,0x8d,0x59,0xd6,0xb8,0xa6,0xda,0x5d,0x2a);
+ DEFINE_GUID(ff_DXVA2_NoEncrypt, 0x1b81beD0, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
+-DEFINE_GUID(ff_GUID_NULL, 0x00000000, 0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
+ DEFINE_GUID(ff_IID_IDirectXVideoDecoderService, 0xfc51a551,0xd5e7,0x11d9,0xaf,0x55,0x00,0x05,0x4e,0x43,0xff,0x02);
+
+ typedef struct dxva_mode {
+@@ -70,6 +69,8 @@ static const int prof_hevc_main[] = {AV_PROFILE_HEVC_MAIN,
+ AV_PROFILE_UNKNOWN};
+ static const int prof_hevc_main10[] = {AV_PROFILE_HEVC_MAIN_10,
+ AV_PROFILE_UNKNOWN};
++static const int prof_hevc_rext[] = {AV_PROFILE_HEVC_REXT,
++ AV_PROFILE_UNKNOWN};
+ static const int prof_vp9_profile0[] = {AV_PROFILE_VP9_0,
+ AV_PROFILE_UNKNOWN};
+ static const int prof_vp9_profile2[] = {AV_PROFILE_VP9_2,
+@@ -95,8 +96,14 @@ static const dxva_mode dxva_modes[] = {
+ { &ff_DXVA2_ModeVC1_D, AV_CODEC_ID_WMV3 },
+
+ /* HEVC/H.265 */
+- { &ff_DXVA2_ModeHEVC_VLD_Main10, AV_CODEC_ID_HEVC, prof_hevc_main10 },
+- { &ff_DXVA2_ModeHEVC_VLD_Main, AV_CODEC_ID_HEVC, prof_hevc_main },
++ { &ff_DXVA2_ModeHEVC_VLD_Main10, AV_CODEC_ID_HEVC, prof_hevc_main10 },
++ { &ff_DXVA2_ModeHEVC_VLD_Main, AV_CODEC_ID_HEVC, prof_hevc_main },
++ { &ff_DXVA2_ModeHEVC_VLD_Main12, AV_CODEC_ID_HEVC, prof_hevc_rext },
++ { &ff_DXVA2_ModeHEVC_VLD_Main10_422, AV_CODEC_ID_HEVC, prof_hevc_rext },
++ { &ff_DXVA2_ModeHEVC_VLD_Main12_422, AV_CODEC_ID_HEVC, prof_hevc_rext },
++ { &ff_DXVA2_ModeHEVC_VLD_Main_444, AV_CODEC_ID_HEVC, prof_hevc_rext },
++ { &ff_DXVA2_ModeHEVC_VLD_Main10_444, AV_CODEC_ID_HEVC, prof_hevc_rext },
++ { &ff_DXVA2_ModeHEVC_VLD_Main12_444, AV_CODEC_ID_HEVC, prof_hevc_rext },
+
+ /* VP8/9 */
+ { &ff_DXVA2_ModeVP9_VLD_Profile0, AV_CODEC_ID_VP9, prof_vp9_profile0 },
+@@ -208,6 +215,8 @@ static int dxva_check_codec_compatibility(AVCodecContext *avctx, const dxva_mode
+ }
+ if (!found)
+ return 0;
++ if (avctx->codec_id == AV_CODEC_ID_HEVC && avctx->profile == AV_PROFILE_HEVC_REXT)
++ return IsEqualGUID(ff_dxva2_hevc_parse_rext_profile(avctx), mode->guid);
+ }
+
+ return 1;
+@@ -246,7 +255,16 @@ static void dxva_list_guids_debug(AVCodecContext *avctx, void *service,
+ #if CONFIG_DXVA2
+ if (sctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) {
+ const D3DFORMAT formats[] = {MKTAG('N', 'V', '1', '2'),
+- MKTAG('P', '0', '1', '0')};
++ MKTAG('A', 'Y', 'U', 'V'),
++ MKTAG('Y', 'U', 'Y', '2'),
++ MKTAG('P', '0', '1', '0'),
++ MKTAG('P', '0', '1', '6'),
++ MKTAG('P', '2', '1', '0'),
++ MKTAG('P', '2', '1', '6'),
++ MKTAG('Y', '2', '1', '0'),
++ MKTAG('Y', '2', '1', '6'),
++ MKTAG('Y', '4', '1', '0'),
++ MKTAG('Y', '4', '1', '6'),};
+ int i;
+ for (i = 0; i < FF_ARRAY_ELEMS(formats); i++) {
+ if (dxva2_validate_output(service, *guid, &formats[i]))
+@@ -315,6 +333,22 @@ static AVBufferRef *bufref_wrap_interface(IUnknown *iface)
+ return av_buffer_create((uint8_t*)iface, 1, bufref_free_interface, iface, 0);
+ }
+
++static enum AVPixelFormat dxva_map_sw_to_hw_frames_format(enum AVPixelFormat pix_fmt)
++{
++ switch (pix_fmt) {
++ case AV_PIX_FMT_YUV420P: return AV_PIX_FMT_NV12;
++ case AV_PIX_FMT_YUV420P10: return AV_PIX_FMT_P010;
++ case AV_PIX_FMT_YUV420P12: return AV_PIX_FMT_P012;
++ case AV_PIX_FMT_YUV422P: return AV_PIX_FMT_YUYV422;
++ case AV_PIX_FMT_YUV422P10: return AV_PIX_FMT_Y210;
++ case AV_PIX_FMT_YUV422P12: return AV_PIX_FMT_Y212;
++ case AV_PIX_FMT_YUV444P: return AV_PIX_FMT_VUYX;
++ case AV_PIX_FMT_YUV444P10: return AV_PIX_FMT_XV30;
++ case AV_PIX_FMT_YUV444P12: return AV_PIX_FMT_XV36;
++ default: return AV_PIX_FMT_NONE;
++ }
++}
++
+ #if CONFIG_DXVA2
+
+ static int dxva2_get_decoder_configuration(AVCodecContext *avctx, const GUID *device_guid,
+@@ -340,14 +374,31 @@ static int dxva2_get_decoder_configuration(AVCodecContext *avctx, const GUID *de
+ return ret;
+ }
+
++static D3DFORMAT dxva2_map_sw_to_hw_format(enum AVPixelFormat pix_fmt)
++{
++ switch (pix_fmt) {
++ case AV_PIX_FMT_NV12: return MKTAG('N', 'V', '1', '2');
++ case AV_PIX_FMT_P010: return MKTAG('P', '0', '1', '0');
++ case AV_PIX_FMT_P012: return MKTAG('P', '0', '1', '6');
++ case AV_PIX_FMT_P016: return MKTAG('P', '0', '1', '6');
++ case AV_PIX_FMT_YUYV422: return MKTAG('Y', 'U', 'Y', '2');
++ case AV_PIX_FMT_Y210: return MKTAG('Y', '2', '1', '0');
++ case AV_PIX_FMT_Y212: return MKTAG('Y', '2', '1', '6');
++ case AV_PIX_FMT_Y216: return MKTAG('Y', '2', '1', '6');
++ case AV_PIX_FMT_VUYX: return MKTAG('A', 'Y', 'U', 'V');
++ case AV_PIX_FMT_XV30: return MKTAG('Y', '4', '1', '0');
++ case AV_PIX_FMT_XV36: return MKTAG('Y', '4', '1', '6');
++ case AV_PIX_FMT_XV48: return MKTAG('Y', '4', '1', '6');
++ default: return D3DFMT_UNKNOWN;
++ }
++}
++
+ static int dxva2_create_decoder(AVCodecContext *avctx)
+ {
+ FFDXVASharedContext *sctx = DXVA_SHARED_CONTEXT(avctx);
+ GUID *guid_list;
+ unsigned guid_count;
+ GUID device_guid;
+- D3DFORMAT surface_format = avctx->sw_pix_fmt == AV_PIX_FMT_YUV420P10 ?
+- MKTAG('P', '0', '1', '0') : MKTAG('N', 'V', '1', '2');
+ DXVA2_VideoDesc desc = { 0 };
+ DXVA2_ConfigPictureDecode config;
+ HRESULT hr;
+@@ -356,6 +407,7 @@ static int dxva2_create_decoder(AVCodecContext *avctx)
+ AVHWFramesContext *frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
+ AVDXVA2FramesContext *frames_hwctx = frames_ctx->hwctx;
+ AVDXVA2DeviceContext *device_hwctx = frames_ctx->device_ctx->hwctx;
++ D3DFORMAT surface_format = dxva2_map_sw_to_hw_format(frames_ctx->sw_format);
+
+ hr = IDirect3DDeviceManager9_OpenDeviceHandle(device_hwctx->devmgr,
+ &device_handle);
+@@ -459,6 +511,16 @@ static DXGI_FORMAT d3d11va_map_sw_to_hw_format(enum AVPixelFormat pix_fmt)
+ case AV_PIX_FMT_NV12: return DXGI_FORMAT_NV12;
+ case AV_PIX_FMT_P010: return DXGI_FORMAT_P010;
+ case AV_PIX_FMT_YUV420P: return DXGI_FORMAT_420_OPAQUE;
++ case AV_PIX_FMT_VUYX: return DXGI_FORMAT_AYUV;
++ case AV_PIX_FMT_YUYV422: return DXGI_FORMAT_YUY2;
++ case AV_PIX_FMT_Y210: return DXGI_FORMAT_Y210;
++ case AV_PIX_FMT_XV30: return DXGI_FORMAT_Y410;
++ case AV_PIX_FMT_P012: return DXGI_FORMAT_P016;
++ case AV_PIX_FMT_P016: return DXGI_FORMAT_P016;
++ case AV_PIX_FMT_Y212: return DXGI_FORMAT_Y216;
++ case AV_PIX_FMT_Y216: return DXGI_FORMAT_Y216;
++ case AV_PIX_FMT_XV36: return DXGI_FORMAT_Y416;
++ case AV_PIX_FMT_XV48: return DXGI_FORMAT_Y416;
+ default: return DXGI_FORMAT_UNKNOWN;
+ }
+ }
+@@ -627,8 +689,7 @@ int ff_dxva2_common_frame_params(AVCodecContext *avctx,
+ else
+ num_surfaces += 2;
+
+- frames_ctx->sw_format = avctx->sw_pix_fmt == AV_PIX_FMT_YUV420P10 ?
+- AV_PIX_FMT_P010 : AV_PIX_FMT_NV12;
++ frames_ctx->sw_format = dxva_map_sw_to_hw_frames_format(avctx->sw_pix_fmt);
+ frames_ctx->width = FFALIGN(avctx->coded_width, surface_alignment);
+ frames_ctx->height = FFALIGN(avctx->coded_height, surface_alignment);
+ frames_ctx->initial_pool_size = num_surfaces;
+diff --git a/libavcodec/dxva2_hevc.c b/libavcodec/dxva2_hevc.c
+index 85698dfcce..cc6cabfb72 100644
+--- a/libavcodec/dxva2_hevc.c
++++ b/libavcodec/dxva2_hevc.c
+@@ -28,11 +28,15 @@
+ #include "hevc/data.h"
+ #include "hevc/hevcdec.h"
+ #include "hwaccel_internal.h"
++#include "h265_profile_level.h"
+
+ #define MAX_SLICES 256
+
+ struct hevc_dxva2_picture_context {
+- DXVA_PicParams_HEVC pp;
++ union {
++ DXVA_PicParams_HEVC pp;
++ ff_DXVA_PicParams_HEVC_RangeExt ppext;
++ };
+ DXVA_Qmatrix_HEVC qm;
+ unsigned slice_count;
+ DXVA_Slice_HEVC_Short slice_short[MAX_SLICES];
+@@ -57,9 +61,82 @@ static int get_refpic_index(const DXVA_PicParams_HEVC *pp, int surface_index)
+ return 0xff;
+ }
+
++static int ptl_convert(const PTLCommon *general_ptl, H265RawProfileTierLevel *h265_raw_ptl)
++{
++ h265_raw_ptl->general_profile_space = general_ptl->profile_space;
++ h265_raw_ptl->general_tier_flag = general_ptl->tier_flag;
++ h265_raw_ptl->general_profile_idc = general_ptl->profile_idc;
++
++ memcpy(h265_raw_ptl->general_profile_compatibility_flag,
++ general_ptl->profile_compatibility_flag, 32 * sizeof(uint8_t));
++
++#define copy_field(name) h265_raw_ptl->general_ ## name = general_ptl->name
++ copy_field(progressive_source_flag);
++ copy_field(interlaced_source_flag);
++ copy_field(non_packed_constraint_flag);
++ copy_field(frame_only_constraint_flag);
++ copy_field(max_12bit_constraint_flag);
++ copy_field(max_10bit_constraint_flag);
++ copy_field(max_8bit_constraint_flag);
++ copy_field(max_422chroma_constraint_flag);
++ copy_field(max_420chroma_constraint_flag);
++ copy_field(max_monochrome_constraint_flag);
++ copy_field(intra_constraint_flag);
++ copy_field(one_picture_only_constraint_flag);
++ copy_field(lower_bit_rate_constraint_flag);
++ copy_field(max_14bit_constraint_flag);
++ copy_field(inbld_flag);
++ copy_field(level_idc);
++#undef copy_field
++
++ return 0;
++}
++
++const GUID *ff_dxva2_hevc_parse_rext_profile(AVCodecContext *avctx)
++{
++ const HEVCContext *h = avctx->priv_data;
++ const HEVCSPS *sps = h->pps->sps;
++ const PTL *ptl = &sps->ptl;
++ const PTLCommon *general_ptl = &ptl->general_ptl;
++ const H265ProfileDescriptor *profile;
++ H265RawProfileTierLevel h265_raw_ptl = {0};
++
++ /* convert PTLCommon to H265RawProfileTierLevel */
++ ptl_convert(general_ptl, &h265_raw_ptl);
++
++ profile = ff_h265_get_profile(&h265_raw_ptl);
++ if (!profile) {
++ av_log(avctx, AV_LOG_ERROR, "HEVC profile is not found.\n");
++ return &ff_GUID_NULL;
++ }
++
++ if (!strcmp(profile->name, "Main 12") ||
++ !strcmp(profile->name, "Main 12 Intra"))
++ return &ff_DXVA2_ModeHEVC_VLD_Main12;
++ else if (!strcmp(profile->name, "Main 4:2:2 10") ||
++ !strcmp(profile->name, "Main 4:2:2 10 Intra"))
++ return &ff_DXVA2_ModeHEVC_VLD_Main10_422;
++ else if (!strcmp(profile->name, "Main 4:2:2 12") ||
++ !strcmp(profile->name, "Main 4:2:2 12 Intra"))
++ return &ff_DXVA2_ModeHEVC_VLD_Main12_422;
++ else if (!strcmp(profile->name, "Main 4:4:4") ||
++ !strcmp(profile->name, "Main 4:4:4 Intra"))
++ return &ff_DXVA2_ModeHEVC_VLD_Main_444;
++ else if (!strcmp(profile->name, "Main 4:4:4 10") ||
++ !strcmp(profile->name, "Main 4:4:4 10 Intra"))
++ return &ff_DXVA2_ModeHEVC_VLD_Main10_444;
++ else if (!strcmp(profile->name, "Main 4:4:4 12") ||
++ !strcmp(profile->name, "Main 4:4:4 12 Intra"))
++ return &ff_DXVA2_ModeHEVC_VLD_Main12_444;
++
++ av_log(avctx, AV_LOG_ERROR, "Unsupported HEVC RExt profile: %s\n", profile->name);
++ return &ff_GUID_NULL;
++}
++
+ void ff_dxva2_hevc_fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *ctx,
+- DXVA_PicParams_HEVC *pp)
++ ff_DXVA_PicParams_HEVC_RangeExt *ppext)
+ {
++ DXVA_PicParams_HEVC *pp = &ppext->params;
+ const HEVCContext *h = avctx->priv_data;
+ const HEVCLayerContext *l = &h->layers[h->cur_layer];
+ const HEVCFrame *current_picture = h->cur_frame;
+@@ -67,7 +144,7 @@ void ff_dxva2_hevc_fill_picture_parameters(const AVCodecContext *avctx, AVDXVACo
+ const HEVCSPS *sps = pps->sps;
+ int i, j;
+
+- memset(pp, 0, sizeof(*pp));
++ memset(ppext, 0, sizeof(*ppext));
+
+ pp->PicWidthInMinCbsY = sps->min_cb_width;
+ pp->PicHeightInMinCbsY = sps->min_cb_height;
+@@ -200,6 +277,32 @@ void ff_dxva2_hevc_fill_picture_parameters(const AVCodecContext *avctx, AVDXVACo
+ DO_REF_LIST(LT_CURR, RefPicSetLtCurr);
+
+ pp->StatusReportFeedbackNumber = 1 + DXVA_CONTEXT_REPORT_ID(avctx, ctx)++;
++
++ if (sps->range_extension) {
++ ppext->transform_skip_rotation_enabled_flag = sps->transform_skip_rotation_enabled;
++ ppext->transform_skip_context_enabled_flag = sps->transform_skip_context_enabled;
++ ppext->implicit_rdpcm_enabled_flag = sps->implicit_rdpcm_enabled;
++ ppext->explicit_rdpcm_enabled_flag = sps->explicit_rdpcm_enabled;
++ ppext->extended_precision_processing_flag = sps->extended_precision_processing;
++ ppext->intra_smoothing_disabled_flag = sps->intra_smoothing_disabled;
++ ppext->persistent_rice_adaptation_enabled_flag = sps->persistent_rice_adaptation_enabled;
++ ppext->high_precision_offsets_enabled_flag = sps->high_precision_offsets_enabled;
++ ppext->cabac_bypass_alignment_enabled_flag = sps->cabac_bypass_alignment_enabled;
++ }
++ if (pps->pps_range_extensions_flag) {
++ ppext->cross_component_prediction_enabled_flag = pps->cross_component_prediction_enabled_flag;
++ ppext->chroma_qp_offset_list_enabled_flag = pps->chroma_qp_offset_list_enabled_flag;
++
++ ppext->diff_cu_chroma_qp_offset_depth = pps->diff_cu_chroma_qp_offset_depth;
++ ppext->log2_sao_offset_scale_luma = pps->log2_sao_offset_scale_luma;
++ ppext->log2_sao_offset_scale_chroma = pps->log2_sao_offset_scale_chroma;
++ ppext->log2_max_transform_skip_block_size_minus2 = pps->log2_max_transform_skip_block_size - 2;
++ ppext->chroma_qp_offset_list_len_minus1 = pps->chroma_qp_offset_list_len_minus1;
++ for (i = 0; i <= pps->chroma_qp_offset_list_len_minus1; i++) {
++ ppext->cb_qp_offset_list[i] = pps->cb_qp_offset_list[i];
++ ppext->cr_qp_offset_list[i] = pps->cr_qp_offset_list[i];
++ }
++ }
+ }
+
+ void ff_dxva2_hevc_fill_scaling_lists(const AVCodecContext *avctx, AVDXVAContext *ctx, DXVA_Qmatrix_HEVC *qm)
+@@ -376,7 +479,7 @@ static int dxva2_hevc_start_frame(AVCodecContext *avctx,
+ av_assert0(ctx_pic);
+
+ /* Fill up DXVA_PicParams_HEVC */
+- ff_dxva2_hevc_fill_picture_parameters(avctx, ctx, &ctx_pic->pp);
++ ff_dxva2_hevc_fill_picture_parameters(avctx, ctx, &ctx_pic->ppext);
+
+ /* Fill up DXVA_Qmatrix_HEVC */
+ ff_dxva2_hevc_fill_scaling_lists(avctx, ctx, &ctx_pic->qm);
+@@ -415,13 +518,15 @@ static int dxva2_hevc_end_frame(AVCodecContext *avctx)
+ HEVCContext *h = avctx->priv_data;
+ struct hevc_dxva2_picture_context *ctx_pic = h->cur_frame->hwaccel_picture_private;
+ int scale = ctx_pic->pp.dwCodingParamToolFlags & 1;
++ int rext = avctx->profile == AV_PROFILE_HEVC_REXT;
+ int ret;
+
+ if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0)
+ return -1;
+
+ ret = ff_dxva2_common_end_frame(avctx, h->cur_frame->f,
+- &ctx_pic->pp, sizeof(ctx_pic->pp),
++ &ctx_pic->pp,
++ rext ? sizeof(ctx_pic->ppext) : sizeof(ctx_pic->pp),
+ scale ? &ctx_pic->qm : NULL, scale ? sizeof(ctx_pic->qm) : 0,
+ commit_bitstream_and_slice_buffer);
+ return ret;
+diff --git a/libavcodec/dxva2_internal.h b/libavcodec/dxva2_internal.h
+index 6cbd0e42d7..4d5656e09b 100644
+--- a/libavcodec/dxva2_internal.h
++++ b/libavcodec/dxva2_internal.h
+@@ -69,6 +69,49 @@
+ #include "avcodec.h"
+ #include "internal.h"
+
++DEFINE_GUID(ff_GUID_NULL, 0x00000000, 0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
++DEFINE_GUID(ff_DXVA2_ModeHEVC_VLD_Main12, 0x1a72925f, 0x0c2c,0x4f15,0x96,0xfb,0xb1,0x7d,0x14,0x73,0x60,0x3f);
++DEFINE_GUID(ff_DXVA2_ModeHEVC_VLD_Main10_422, 0x0bac4fe5, 0x1532,0x4429,0xa8,0x54,0xf8,0x4d,0xe0,0x49,0x53,0xdb);
++DEFINE_GUID(ff_DXVA2_ModeHEVC_VLD_Main12_422, 0x55bcac81, 0xf311,0x4093,0xa7,0xd0,0x1c,0xbc,0x0b,0x84,0x9b,0xee);
++DEFINE_GUID(ff_DXVA2_ModeHEVC_VLD_Main_444, 0x4008018f, 0xf537,0x4b36,0x98,0xcf,0x61,0xaf,0x8a,0x2c,0x1a,0x33);
++DEFINE_GUID(ff_DXVA2_ModeHEVC_VLD_Main10_444, 0x0dabeffa, 0x4458,0x4602,0xbc,0x03,0x07,0x95,0x65,0x9d,0x61,0x7c);
++DEFINE_GUID(ff_DXVA2_ModeHEVC_VLD_Main12_444, 0x9798634d, 0xfe9d,0x48e5,0xb4,0xda,0xdb,0xec,0x45,0xb3,0xdf,0x01);
++
++/* This is only defined starting in the Windows 11 24H2 SDK */
++#pragma pack(push,1)
++typedef struct ff_DXVA_PicParams_HEVC_RangeExt {
++ DXVA_PicParams_HEVC params;
++
++ union {
++ struct {
++ USHORT transform_skip_rotation_enabled_flag : 1;
++ USHORT transform_skip_context_enabled_flag : 1;
++ USHORT implicit_rdpcm_enabled_flag : 1;
++ USHORT explicit_rdpcm_enabled_flag : 1;
++ USHORT extended_precision_processing_flag : 1;
++ USHORT intra_smoothing_disabled_flag : 1;
++ USHORT persistent_rice_adaptation_enabled_flag : 1;
++ USHORT high_precision_offsets_enabled_flag : 1;
++ USHORT cabac_bypass_alignment_enabled_flag : 1;
++ USHORT cross_component_prediction_enabled_flag : 1;
++ USHORT chroma_qp_offset_list_enabled_flag : 1;
++ USHORT ReservedBits8 : 5;
++ };
++ USHORT dwRangeExtensionFlags;
++ };
++
++ UCHAR diff_cu_chroma_qp_offset_depth;
++ UCHAR log2_sao_offset_scale_luma;
++ UCHAR log2_sao_offset_scale_chroma;
++ UCHAR log2_max_transform_skip_block_size_minus2;
++ CHAR cb_qp_offset_list[6];
++ CHAR cr_qp_offset_list[6];
++ UCHAR chroma_qp_offset_list_len_minus1;
++ USHORT ReservedBits9;
++
++} ff_DXVA_PicParams_HEVC_RangeExt;
++#pragma pack(pop)
++
+ typedef void DECODER_BUFFER_DESC;
+
+ typedef union {
+@@ -172,9 +215,11 @@ void ff_dxva2_h264_fill_picture_parameters(const AVCodecContext *avctx, AVDXVACo
+ void ff_dxva2_h264_fill_scaling_lists(const AVCodecContext *avctx, AVDXVAContext *ctx, DXVA_Qmatrix_H264 *qm);
+
+ #if CONFIG_HEVC_D3D12VA_HWACCEL || CONFIG_HEVC_D3D11VA_HWACCEL || CONFIG_HEVC_D3D11VA2_HWACCEL || CONFIG_HEVC_DXVA2_HWACCEL
+-void ff_dxva2_hevc_fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *ctx, DXVA_PicParams_HEVC *pp);
++void ff_dxva2_hevc_fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *ctx, ff_DXVA_PicParams_HEVC_RangeExt *ppext);
+
+ void ff_dxva2_hevc_fill_scaling_lists(const AVCodecContext *avctx, AVDXVAContext *ctx, DXVA_Qmatrix_HEVC *qm);
++
++const GUID *ff_dxva2_hevc_parse_rext_profile(AVCodecContext *avctx);
+ #endif
+
+ #if CONFIG_VP9_D3D12VA_HWACCEL || CONFIG_VP9_D3D11VA_HWACCEL || CONFIG_VP9_D3D11VA2_HWACCEL || CONFIG_VP9_DXVA2_HWACCEL
+diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
+index ae5f0fe69d..b20be7588f 100644
+--- a/libavcodec/hevc/hevcdec.c
++++ b/libavcodec/hevc/hevcdec.c
+@@ -648,6 +648,16 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
+ #endif
+ break;
+ case AV_PIX_FMT_YUV444P:
++#if CONFIG_HEVC_DXVA2_HWACCEL
++ *fmt++ = AV_PIX_FMT_DXVA2_VLD;
++#endif
++#if CONFIG_HEVC_D3D11VA_HWACCEL
++ *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
++ *fmt++ = AV_PIX_FMT_D3D11;
++#endif
++#if CONFIG_HEVC_D3D12VA_HWACCEL
++ *fmt++ = AV_PIX_FMT_D3D12;
++#endif
+ #if CONFIG_HEVC_VAAPI_HWACCEL
+ *fmt++ = AV_PIX_FMT_VAAPI;
+ #endif
+@@ -666,6 +676,16 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
+ break;
+ case AV_PIX_FMT_YUV422P:
+ case AV_PIX_FMT_YUV422P10LE:
++#if CONFIG_HEVC_DXVA2_HWACCEL
++ *fmt++ = AV_PIX_FMT_DXVA2_VLD;
++#endif
++#if CONFIG_HEVC_D3D11VA_HWACCEL
++ *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
++ *fmt++ = AV_PIX_FMT_D3D11;
++#endif
++#if CONFIG_HEVC_D3D12VA_HWACCEL
++ *fmt++ = AV_PIX_FMT_D3D12;
++#endif
+ #if CONFIG_HEVC_VAAPI_HWACCEL
+ *fmt++ = AV_PIX_FMT_VAAPI;
+ #endif
+@@ -686,6 +706,16 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
+ /* NOTE: fallthrough */
+ case AV_PIX_FMT_YUV420P12:
+ case AV_PIX_FMT_YUV444P12:
++#if CONFIG_HEVC_DXVA2_HWACCEL
++ *fmt++ = AV_PIX_FMT_DXVA2_VLD;
++#endif
++#if CONFIG_HEVC_D3D11VA_HWACCEL
++ *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
++ *fmt++ = AV_PIX_FMT_D3D11;
++#endif
++#if CONFIG_HEVC_D3D12VA_HWACCEL
++ *fmt++ = AV_PIX_FMT_D3D12;
++#endif
+ #if CONFIG_HEVC_VAAPI_HWACCEL
+ *fmt++ = AV_PIX_FMT_VAAPI;
+ #endif
+@@ -700,6 +730,16 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
+ #endif
+ break;
+ case AV_PIX_FMT_YUV422P12:
++#if CONFIG_HEVC_DXVA2_HWACCEL
++ *fmt++ = AV_PIX_FMT_DXVA2_VLD;
++#endif
++#if CONFIG_HEVC_D3D11VA_HWACCEL
++ *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
++ *fmt++ = AV_PIX_FMT_D3D11;
++#endif
++#if CONFIG_HEVC_D3D12VA_HWACCEL
++ *fmt++ = AV_PIX_FMT_D3D12;
++#endif
+ #if CONFIG_HEVC_VAAPI_HWACCEL
+ *fmt++ = AV_PIX_FMT_VAAPI;
+ #endif
+--
+2.52.0.windows.1
+
=====================================
contrib/src/ffmpeg/0001-avcodec-dxva2_hevc-add-support-for-parsing-HEVC-Rang.patch deleted
=====================================
@@ -1,273 +0,0 @@
-From b8a6a11e1be9712e4274de8f9dc49b63f3a1e54c Mon Sep 17 00:00:00 2001
-From: Steve Lhomme <robux4 at ycbcr.xyz>
-Date: Thu, 3 Oct 2019 14:05:40 +0200
-Subject: [PATCH 03/10] avcodec/dxva2_hevc: add support for parsing HEVC Range
- Extension data
-
----
- libavcodec/d3d11va.h | 2 ++
- libavcodec/d3d12va_hevc.c | 9 +++++---
- libavcodec/dxva2.c | 19 ++++++++++++++++
- libavcodec/dxva2.h | 2 ++
- libavcodec/dxva2_hevc.c | 43 ++++++++++++++++++++++++++++++++-----
- libavcodec/dxva2_internal.h | 41 ++++++++++++++++++++++++++++++++++-
- 6 files changed, 107 insertions(+), 9 deletions(-)
-
-diff --git a/libavcodec/d3d11va.h b/libavcodec/d3d11va.h
-index 27f40e5519..67ce8d3871 100644
---- a/libavcodec/d3d11va.h
-+++ b/libavcodec/d3d11va.h
-@@ -38,6 +38,8 @@
- #include <stdint.h>
- #include <d3d11.h>
-
-+#define FF_DXVA2_WORKAROUND_HEVC_REXT 4
-+
- /**
- * @defgroup lavc_codec_hwaccel_d3d11va Direct3D11
- * @ingroup lavc_codec_hwaccel
-diff --git a/libavcodec/d3d12va_hevc.c b/libavcodec/d3d12va_hevc.c
-index e72d49b7d9..a19931b7de 100644
---- a/libavcodec/d3d12va_hevc.c
-+++ b/libavcodec/d3d12va_hevc.c
-@@ -33,7 +33,7 @@
- #define MAX_SLICES 256
-
- typedef struct HEVCDecodePictureContext {
-- DXVA_PicParams_HEVC pp;
-+ DXVA_PicParams_HEVC_Rext pp;
- DXVA_Qmatrix_HEVC qm;
- unsigned slice_count;
- DXVA_Slice_HEVC_Short slice_short[MAX_SLICES];
-@@ -151,15 +151,18 @@ static int update_input_arguments(AVCodecContext *avctx, D3D12_VIDEO_DECODE_INPU
-
- static int d3d12va_hevc_end_frame(AVCodecContext *avctx)
- {
-+ D3D12VADecodeContext *ctx = D3D12VA_DECODE_CONTEXT(avctx);
- HEVCContext *h = avctx->priv_data;
- HEVCDecodePictureContext *ctx_pic = h->cur_frame->hwaccel_picture_private;
-+ int rext = (DXVA_CONTEXT_WORKAROUND(avctx, ((AVDXVAContext *)ctx)) & FF_DXVA2_WORKAROUND_INTEL_HEVC_REXT);
-
-- int scale = ctx_pic->pp.dwCodingParamToolFlags & 1;
-+ int scale = ctx_pic->pp.main.dwCodingParamToolFlags & 1;
-
- if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0)
- return -1;
-
-- return ff_d3d12va_common_end_frame(avctx, h->cur_frame->f, &ctx_pic->pp, sizeof(ctx_pic->pp),
-+ return ff_d3d12va_common_end_frame(avctx, h->cur_frame->f,
-+ &ctx_pic->pp, rext ? sizeof(ctx_pic->pp) : sizeof(ctx_pic->pp.main),
- scale ? &ctx_pic->qm : NULL, scale ? sizeof(ctx_pic->qm) : 0, update_input_arguments);
- }
-
-diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
-index 22ecd5acaf..f7b0c5aed2 100644
---- a/libavcodec/dxva2.c
-+++ b/libavcodec/dxva2.c
-@@ -51,6 +51,15 @@ DEFINE_GUID(ff_DXVA2_NoEncrypt, 0x1b81beD0, 0xa0c7,0x11d3,0xb9,0x84,0x0
- DEFINE_GUID(ff_GUID_NULL, 0x00000000, 0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
- DEFINE_GUID(ff_IID_IDirectXVideoDecoderService, 0xfc51a551,0xd5e7,0x11d9,0xaf,0x55,0x00,0x05,0x4e,0x43,0xff,0x02);
-
-+DEFINE_GUID(ff_DXVA_ModeHEVC_VLD_Main_Intel, 0x8c56eb1e, 0x2b47, 0x466f, 0x8d, 0x33, 0x7d, 0xbc, 0xd6, 0x3f, 0x3d, 0xf2);
-+DEFINE_GUID(ff_DXVA_ModeHEVC_VLD_Main10_Intel, 0x75fc75f7, 0xc589, 0x4a07, 0xa2, 0x5b, 0x72, 0xe0, 0x3b, 0x03, 0x83, 0xb3);
-+DEFINE_GUID(ff_DXVA_ModeHEVC_VLD_Main12_Intel, 0x8ff8a3aa, 0xc456, 0x4132, 0xb6, 0xef, 0x69, 0xd9, 0xdd, 0x72, 0x57, 0x1d);
-+DEFINE_GUID(ff_DXVA_ModeHEVC_VLD_Main422_10_Intel, 0xe484dcb8, 0xcac9, 0x4859, 0x99, 0xf5, 0x5c, 0x0d, 0x45, 0x06, 0x90, 0x89);
-+DEFINE_GUID(ff_DXVA_ModeHEVC_VLD_Main422_12_Intel, 0xc23dd857, 0x874b, 0x423c, 0xb6, 0xe0, 0x82, 0xce, 0xaa, 0x9b, 0x11, 0x8a);
-+DEFINE_GUID(ff_DXVA_ModeHEVC_VLD_Main444_Intel, 0x41a5af96, 0xe415, 0x4b0c, 0x9d, 0x03, 0x90, 0x78, 0x58, 0xe2, 0x3e, 0x78);
-+DEFINE_GUID(ff_DXVA_ModeHEVC_VLD_Main444_10_Intel, 0x6a6a81ba, 0x912a, 0x485d, 0xb5, 0x7f, 0xcc, 0xd2, 0xd3, 0x7b, 0x8d, 0x94);
-+DEFINE_GUID(ff_DXVA_ModeHEVC_VLD_Main444_12_Intel, 0x5b08e35d, 0x0c66, 0x4c51, 0xa6, 0xf1, 0x89, 0xd0, 0x0c, 0xb2, 0xc1, 0x97);
-+
- typedef struct dxva_mode {
- const GUID *guid;
- enum AVCodecID codec;
-@@ -302,6 +311,16 @@ static int dxva_get_decoder_guid(AVCodecContext *avctx, void *service, void *sur
- if (IsEqualGUID(decoder_guid, &ff_DXVADDI_Intel_ModeH264_E))
- sctx->workaround |= FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO;
-
-+ if (IsEqualGUID(decoder_guid, &ff_DXVA_ModeHEVC_VLD_Main_Intel) ||
-+ IsEqualGUID(decoder_guid, &ff_DXVA_ModeHEVC_VLD_Main10_Intel) ||
-+ IsEqualGUID(decoder_guid, &ff_DXVA_ModeHEVC_VLD_Main12_Intel) ||
-+ IsEqualGUID(decoder_guid, &ff_DXVA_ModeHEVC_VLD_Main422_10_Intel) ||
-+ IsEqualGUID(decoder_guid, &ff_DXVA_ModeHEVC_VLD_Main422_12_Intel) ||
-+ IsEqualGUID(decoder_guid, &ff_DXVA_ModeHEVC_VLD_Main444_Intel) ||
-+ IsEqualGUID(decoder_guid, &ff_DXVA_ModeHEVC_VLD_Main444_10_Intel) ||
-+ IsEqualGUID(decoder_guid, &ff_DXVA_ModeHEVC_VLD_Main444_12_Intel))
-+ sctx->workaround |= FF_DXVA2_WORKAROUND_INTEL_HEVC_REXT;
-+
- return 0;
- }
-
-diff --git a/libavcodec/dxva2.h b/libavcodec/dxva2.h
-index bdec6112e9..1520964878 100644
---- a/libavcodec/dxva2.h
-+++ b/libavcodec/dxva2.h
-@@ -38,6 +38,8 @@
- #include <d3d9.h>
- #include <dxva2api.h>
-
-+#define FF_DXVA2_WORKAROUND_HEVC_REXT 4
-+
- /**
- * @defgroup lavc_codec_hwaccel_dxva2 DXVA2
- * @ingroup lavc_codec_hwaccel
-diff --git a/libavcodec/dxva2_hevc.c b/libavcodec/dxva2_hevc.c
-index 85698dfcce..7c11621f5a 100644
---- a/libavcodec/dxva2_hevc.c
-+++ b/libavcodec/dxva2_hevc.c
-@@ -28,11 +28,12 @@
- #include "hevc/data.h"
- #include "hevc/hevcdec.h"
- #include "hwaccel_internal.h"
-+#include "cbs_h265.h"
-
- #define MAX_SLICES 256
-
- struct hevc_dxva2_picture_context {
-- DXVA_PicParams_HEVC pp;
-+ DXVA_PicParams_HEVC_Rext pp;
- DXVA_Qmatrix_HEVC qm;
- unsigned slice_count;
- DXVA_Slice_HEVC_Short slice_short[MAX_SLICES];
-@@ -58,7 +59,7 @@ static int get_refpic_index(const DXVA_PicParams_HEVC *pp, int surface_index)
- }
-
- void ff_dxva2_hevc_fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *ctx,
-- DXVA_PicParams_HEVC *pp)
-+ DXVA_PicParams_HEVC_Rext *ppext)
- {
- const HEVCContext *h = avctx->priv_data;
- const HEVCLayerContext *l = &h->layers[h->cur_layer];
-@@ -66,12 +67,42 @@ void ff_dxva2_hevc_fill_picture_parameters(const AVCodecContext *avctx, AVDXVACo
- const HEVCPPS *pps = h->pps;
- const HEVCSPS *sps = pps->sps;
- int i, j;
-+ DXVA_PicParams_HEVC *pp = &ppext->main;
-
-- memset(pp, 0, sizeof(*pp));
-+ memset(ppext, 0, sizeof(*ppext));
-
- pp->PicWidthInMinCbsY = sps->min_cb_width;
- pp->PicHeightInMinCbsY = sps->min_cb_height;
-
-+ if (sps->range_extension) {
-+ ppext->dwRangeExtensionFlags |= (sps->transform_skip_rotation_enabled << 0) |
-+ (sps->transform_skip_context_enabled << 1) |
-+ (sps->implicit_rdpcm_enabled << 2) |
-+ (sps->explicit_rdpcm_enabled << 3) |
-+ (sps->extended_precision_processing << 4) |
-+ (sps->intra_smoothing_disabled << 5) |
-+ (sps->high_precision_offsets_enabled << 5) |
-+ (sps->persistent_rice_adaptation_enabled << 7) |
-+ (sps->cabac_bypass_alignment_enabled << 8);
-+ }
-+ if (pps->pps_range_extensions_flag) {
-+ ppext->dwRangeExtensionFlags |= (pps->cross_component_prediction_enabled_flag << 9) |
-+ (pps->chroma_qp_offset_list_enabled_flag << 10);
-+ if (pps->chroma_qp_offset_list_enabled_flag) {
-+ ppext->diff_cu_chroma_qp_offset_depth = pps->diff_cu_chroma_qp_offset_depth;
-+ ppext->chroma_qp_offset_list_len_minus1 = pps->chroma_qp_offset_list_len_minus1;
-+ for (i = 0; i <= pps->chroma_qp_offset_list_len_minus1; i++) {
-+ ppext->cb_qp_offset_list[i] = pps->cb_qp_offset_list[i];
-+ ppext->cr_qp_offset_list[i] = pps->cr_qp_offset_list[i];
-+ }
-+ }
-+ ppext->log2_sao_offset_scale_luma = pps->log2_sao_offset_scale_luma;
-+ ppext->log2_sao_offset_scale_chroma = pps->log2_sao_offset_scale_chroma;
-+ if (pps->transform_skip_enabled_flag) {
-+ ppext->log2_max_transform_skip_block_size_minus2 = pps->log2_max_transform_skip_block_size - 2;
-+ }
-+ }
-+
- pp->wFormatAndSequenceInfoFlags = (sps->chroma_format_idc << 0) |
- (sps->separate_colour_plane << 2) |
- ((sps->bit_depth - 8) << 3) |
-@@ -412,16 +443,18 @@ static int dxva2_hevc_decode_slice(AVCodecContext *avctx,
-
- static int dxva2_hevc_end_frame(AVCodecContext *avctx)
- {
-+ AVDXVAContext *ctx = DXVA_CONTEXT(avctx);
- HEVCContext *h = avctx->priv_data;
- struct hevc_dxva2_picture_context *ctx_pic = h->cur_frame->hwaccel_picture_private;
-- int scale = ctx_pic->pp.dwCodingParamToolFlags & 1;
-+ int scale = ctx_pic->pp.main.dwCodingParamToolFlags & 1;
-+ int rext = (DXVA_CONTEXT_WORKAROUND(avctx, ctx) & FF_DXVA2_WORKAROUND_INTEL_HEVC_REXT);
- int ret;
-
- if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0)
- return -1;
-
- ret = ff_dxva2_common_end_frame(avctx, h->cur_frame->f,
-- &ctx_pic->pp, sizeof(ctx_pic->pp),
-+ &ctx_pic->pp, rext ? sizeof(ctx_pic->pp) : sizeof(ctx_pic->pp.main),
- scale ? &ctx_pic->qm : NULL, scale ? sizeof(ctx_pic->qm) : 0,
- commit_bitstream_and_slice_buffer);
- return ret;
-diff --git a/libavcodec/dxva2_internal.h b/libavcodec/dxva2_internal.h
-index 6cbd0e42d7..6c301ae85a 100644
---- a/libavcodec/dxva2_internal.h
-+++ b/libavcodec/dxva2_internal.h
-@@ -33,6 +33,7 @@
-
- #define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2/Direct3D11 and old UVD/UVD+ ATI video cards
- #define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for DXVA2/Direct3D11 and old Intel GPUs with ClearVideo interface
-+#define FF_DXVA2_WORKAROUND_INTEL_HEVC_REXT 4 ///< Signal the DXVA2 decoder is using the HEVC Rext picture structure
-
- #if CONFIG_DXVA2
- #include "dxva2.h"
-@@ -113,6 +114,44 @@ typedef struct FFDXVASharedContext {
- AVDXVAContext ctx;
- } FFDXVASharedContext;
-
-+#pragma pack(push, 1)
-+typedef struct
-+{
-+ DXVA_PicParams_HEVC main;
-+
-+ // HEVC Range Extension
-+ union {
-+ struct {
-+ UINT32 transform_skip_rotation_enabled_flag : 1;
-+ UINT32 transform_skip_context_enabled_flag : 1;
-+ UINT32 implicit_rdpcm_enabled_flag : 1;
-+ UINT32 explicit_rdpcm_enabled_flag : 1;
-+ UINT32 extended_precision_processing_flag : 1;
-+ UINT32 intra_smoothing_disabled_flag : 1;
-+ UINT32 high_precision_offsets_enabled_flag : 1;
-+ UINT32 persistent_rice_adaptation_enabled_flag : 1;
-+ UINT32 cabac_bypass_alignment_enabled_flag : 1;
-+ UINT32 cross_component_prediction_enabled_flag : 1;
-+ UINT32 chroma_qp_offset_list_enabled_flag : 1;
-+ UINT32 BitDepthLuma16 : 1; // TODO merge in ReservedBits5 if not needed
-+ UINT32 BitDepthChroma16 : 1; // TODO merge in ReservedBits5 if not needed
-+ UINT32 ReservedBits8 : 19;
-+ };
-+ UINT32 dwRangeExtensionFlags;
-+ };
-+
-+ UCHAR diff_cu_chroma_qp_offset_depth;
-+ UCHAR chroma_qp_offset_list_len_minus1;
-+ UCHAR log2_sao_offset_scale_luma;
-+ UCHAR log2_sao_offset_scale_chroma;
-+ UCHAR log2_max_transform_skip_block_size_minus2;
-+ CHAR cb_qp_offset_list[6];
-+ CHAR cr_qp_offset_list[6];
-+
-+} DXVA_PicParams_HEVC_Rext;
-+#pragma pack(pop)
-+
-+
- #define DXVA_SHARED_CONTEXT(avctx) ((FFDXVASharedContext *)((avctx)->internal->hwaccel_priv_data))
-
- #define DXVA_CONTEXT(avctx) (AVDXVAContext *)((avctx)->hwaccel_context ? (avctx)->hwaccel_context : (&(DXVA_SHARED_CONTEXT(avctx)->ctx)))
-@@ -172,7 +211,7 @@ void ff_dxva2_h264_fill_picture_parameters(const AVCodecContext *avctx, AVDXVACo
- void ff_dxva2_h264_fill_scaling_lists(const AVCodecContext *avctx, AVDXVAContext *ctx, DXVA_Qmatrix_H264 *qm);
-
- #if CONFIG_HEVC_D3D12VA_HWACCEL || CONFIG_HEVC_D3D11VA_HWACCEL || CONFIG_HEVC_D3D11VA2_HWACCEL || CONFIG_HEVC_DXVA2_HWACCEL
--void ff_dxva2_hevc_fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *ctx, DXVA_PicParams_HEVC *pp);
-+void ff_dxva2_hevc_fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *ctx, DXVA_PicParams_HEVC_Rext *pp);
-
- void ff_dxva2_hevc_fill_scaling_lists(const AVCodecContext *avctx, AVDXVAContext *ctx, DXVA_Qmatrix_HEVC *qm);
- #endif
---
-2.45.1.windows.1
-
=====================================
contrib/src/ffmpeg/0002-avcodec-hevcdec-allow-HEVC-444-8-10-12-bits-decoding.patch deleted
=====================================
@@ -1,52 +0,0 @@
-From 344ab39580f914227afea57d780b94b859c511a0 Mon Sep 17 00:00:00 2001
-From: Steve Lhomme <robux4 at ycbcr.xyz>
-Date: Tue, 20 Aug 2019 13:10:24 +0200
-Subject: [PATCH 04/10] avcodec/hevcdec: allow HEVC 444 8/10/12 bits decoding
- with DXVA2/D3D11VA/D3D12VA
-
-And 4:2:0 12 bits as well.
----
- libavcodec/hevc/hevcdec.c | 20 ++++++++++++++++++++
- 1 file changed, 20 insertions(+)
-
-diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
-index f44bda8a92..86a8f291a1 100644
---- a/libavcodec/hevc/hevcdec.c
-+++ b/libavcodec/hevc/hevcdec.c
-@@ -650,6 +650,16 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
- #if CONFIG_HEVC_VAAPI_HWACCEL
- *fmt++ = AV_PIX_FMT_VAAPI;
- #endif
-+#if CONFIG_HEVC_DXVA2_HWACCEL
-+ *fmt++ = AV_PIX_FMT_DXVA2_VLD;
-+#endif
-+#if CONFIG_HEVC_D3D11VA_HWACCEL
-+ *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
-+ *fmt++ = AV_PIX_FMT_D3D11;
-+#endif
-+#if CONFIG_HEVC_D3D12VA_HWACCEL
-+ *fmt++ = AV_PIX_FMT_D3D12;
-+#endif
- #if CONFIG_HEVC_VDPAU_HWACCEL
- *fmt++ = AV_PIX_FMT_VDPAU;
- #endif
-@@ -688,6 +698,16 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
- #if CONFIG_HEVC_VAAPI_HWACCEL
- *fmt++ = AV_PIX_FMT_VAAPI;
- #endif
-+#if CONFIG_HEVC_DXVA2_HWACCEL
-+ *fmt++ = AV_PIX_FMT_DXVA2_VLD;
-+#endif
-+#if CONFIG_HEVC_D3D11VA_HWACCEL
-+ *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
-+ *fmt++ = AV_PIX_FMT_D3D11;
-+#endif
-+#if CONFIG_HEVC_D3D12VA_HWACCEL
-+ *fmt++ = AV_PIX_FMT_D3D12;
-+#endif
- #if CONFIG_HEVC_VDPAU_HWACCEL
- *fmt++ = AV_PIX_FMT_VDPAU;
- #endif
---
-2.45.1.windows.1
-
=====================================
contrib/src/ffmpeg/0003-avcodec-hevcdec-allow-HEVC-422-10-12-bits-decoding-w.patch deleted
=====================================
@@ -1,51 +0,0 @@
-From f26eb2a4a6c4f10fe4b7833c8ef98e0255515e79 Mon Sep 17 00:00:00 2001
-From: Steve Lhomme <robux4 at ycbcr.xyz>
-Date: Fri, 4 Oct 2019 12:42:11 +0200
-Subject: [PATCH 05/10] avcodec/hevcdec: allow HEVC 422 10/12 bits decoding
- with DXVA2/D3D11VA/D3D12VA
-
----
- libavcodec/hevc/hevcdec.c | 20 ++++++++++++++++++++
- 1 file changed, 20 insertions(+)
-
-diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
-index 86a8f291a1..77dbfde64b 100644
---- a/libavcodec/hevc/hevcdec.c
-+++ b/libavcodec/hevc/hevcdec.c
-@@ -686,6 +686,16 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
- #endif
- #if CONFIG_HEVC_NVDEC_HWACCEL
- *fmt++ = AV_PIX_FMT_CUDA;
-+#endif
-+#if CONFIG_HEVC_DXVA2_HWACCEL
-+ *fmt++ = AV_PIX_FMT_DXVA2_VLD;
-+#endif
-+#if CONFIG_HEVC_D3D11VA_HWACCEL
-+ *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
-+ *fmt++ = AV_PIX_FMT_D3D11;
-+#endif
-+#if CONFIG_HEVC_D3D12VA_HWACCEL
-+ *fmt++ = AV_PIX_FMT_D3D12;
- #endif
- break;
- case AV_PIX_FMT_YUV444P10:
-@@ -727,6 +737,16 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
- #endif
- #if CONFIG_HEVC_NVDEC_HWACCEL
- *fmt++ = AV_PIX_FMT_CUDA;
-+#endif
-+#if CONFIG_HEVC_DXVA2_HWACCEL
-+ *fmt++ = AV_PIX_FMT_DXVA2_VLD;
-+#endif
-+#if CONFIG_HEVC_D3D11VA_HWACCEL
-+ *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
-+ *fmt++ = AV_PIX_FMT_D3D11;
-+#endif
-+#if CONFIG_HEVC_D3D12VA_HWACCEL
-+ *fmt++ = AV_PIX_FMT_D3D12;
- #endif
- break;
- }
---
-2.45.1.windows.1
-
=====================================
contrib/src/ffmpeg/rules.mak
=====================================
@@ -233,9 +233,7 @@ ffmpeg: ffmpeg-$(FFMPEG_VERSION).tar.xz .sum-ffmpeg
$(UNPACK)
$(APPLY) $(SRC)/ffmpeg/dxva_vc1_crash.patch
$(APPLY) $(SRC)/ffmpeg/h264_early_SAR.patch
- $(APPLY) $(SRC)/ffmpeg/0001-avcodec-dxva2_hevc-add-support-for-parsing-HEVC-Rang.patch
- $(APPLY) $(SRC)/ffmpeg/0002-avcodec-hevcdec-allow-HEVC-444-8-10-12-bits-decoding.patch
- $(APPLY) $(SRC)/ffmpeg/0003-avcodec-hevcdec-allow-HEVC-422-10-12-bits-decoding-w.patch
+ $(APPLY) $(SRC)/ffmpeg/0001-avcodec-dxva2-add-support-for-HEVC-RExt-DXVA-profile.patch
$(APPLY) $(SRC)/ffmpeg/0001-avcodec-mpeg12dec-don-t-call-hw-end_frame-when-start.patch
$(APPLY) $(SRC)/ffmpeg/0002-avcodec-mpeg12dec-don-t-end-a-slice-without-first_sl.patch
$(APPLY) $(SRC)/ffmpeg/0001-fix-mf_utils-compilation-with-mingw64.patch
=====================================
modules/codec/avcodec/directx_va.c
=====================================
@@ -64,10 +64,8 @@ static const int PROF_HEVC_MAIN10[] = { AVPROFILE(HEVC_MAIN),
AVPROFILE(HEVC_MAIN_10),
AVPROFILE(UNKNOWN) };
-#ifdef FF_DXVA2_WORKAROUND_HEVC_REXT
static const int PROF_HEVC_MAIN_REXT[] = { AVPROFILE(HEVC_REXT),
AVPROFILE(UNKNOWN) };
-#endif
static const int PROF_VP9_MAIN[] = { AVPROFILE(VP9_0), AVPROFILE(UNKNOWN) };
static const int PROF_VP9_10[] = { AVPROFILE(VP9_2), AVPROFILE(UNKNOWN) };
@@ -77,6 +75,16 @@ static const int PROF_AV1_HIGH[] = { AVPROFILE(AV1_HIGH), AVPROFILE(AV1_MAIN)
#if defined(__MINGW64_VERSION_MAJOR) // mingw-w64 doesn't have all the standard GUIDs
+#if __MINGW64_VERSION_MAJOR < 13
+// define missing GUIDs added in mingw-w64 v13 and not mapped to other guids
+DEFINE_GUID(DXVA_ModeHEVC_VLD_Main12, 0x1a72925f, 0x0c2c, 0x4f15, 0x96, 0xfb, 0xb1, 0x7d, 0x14, 0x73, 0x60, 0x3f);
+DEFINE_GUID(DXVA_ModeHEVC_VLD_Main10_422, 0x0bac4fe5, 0x1532, 0x4429, 0xa8, 0x54, 0xf8, 0x4d, 0xe0, 0x49, 0x53, 0xdb);
+DEFINE_GUID(DXVA_ModeHEVC_VLD_Main12_422, 0x55bcac81, 0xf311, 0x4093, 0xa7, 0xd0, 0x1c, 0xbc, 0x0b, 0x84, 0x9b, 0xee);
+DEFINE_GUID(DXVA_ModeHEVC_VLD_Main_444, 0x4008018f, 0xf537, 0x4b36, 0x98, 0xcf, 0x61, 0xaf, 0x8a, 0x2c, 0x1a, 0x33);
+DEFINE_GUID(DXVA_ModeHEVC_VLD_Main10_444, 0x0dabeffa, 0x4458, 0x4602, 0xbc, 0x03, 0x07, 0x95, 0x65, 0x9d, 0x61, 0x7c);
+DEFINE_GUID(DXVA_ModeHEVC_VLD_Main12_444, 0x9798634d, 0xfe9d, 0x48e5, 0xb4, 0xda, 0xdb, 0xec, 0x45, 0xb3, 0xdf, 0x01);
+#endif
+
# if defined(HAVE_LIBAVCODEC_DXVA2_H)
// do nothing, we have redirected DXVA_xxx to DXVA2_xxx
# elif defined(HAVE_LIBAVCODEC_D3D11VA_H) && __MINGW64_VERSION_MAJOR > 11
@@ -271,16 +279,20 @@ static const directx_va_mode_t DXVA_MODES[] = {
// Intel specific GUID support
DEF_DXVA_MODE_420_8B( "HEVC Main profile (Intel)", &DXVA_ModeHEVC_VLD_Main_Intel, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN ),
DEF_DXVA_MODE_420_10B( "HEVC Main 10 profile (Intel)", &DXVA_ModeHEVC_VLD_Main10_Intel, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN10 ),
-#ifdef FF_DXVA2_WORKAROUND_HEVC_REXT
- DEF_DXVA_MODE( "HEVC Main profile 4:2:2 Range Extension (Intel)", &DXVA_ModeHEVC_VLD_Main12_Intel, 8, 1, 0, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN_REXT, FF_DXVA2_WORKAROUND_HEVC_REXT ),
- DEF_DXVA_MODE( "HEVC Main 10 profile 4:2:2 Range Extension (Intel)", &DXVA_ModeHEVC_VLD_Main422_10_Intel, 10, 1, 0, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN_REXT, FF_DXVA2_WORKAROUND_HEVC_REXT ),
- DEF_DXVA_MODE( "HEVC Main 12 profile 4:2:2 Range Extension (Intel)", &DXVA_ModeHEVC_VLD_Main422_12_Intel, 12, 1, 0, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN_REXT, FF_DXVA2_WORKAROUND_HEVC_REXT ),
- DEF_DXVA_MODE( "HEVC Main profile 4:4:4 Range Extension (Intel)", &DXVA_ModeHEVC_VLD_Main444_Intel, 8, 0, 0, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN_REXT, FF_DXVA2_WORKAROUND_HEVC_REXT ),
- DEF_DXVA_MODE( "HEVC Main 10 profile 4:4:4 Range Extension (Intel)", &DXVA_ModeHEVC_VLD_Main444_10_Intel, 10, 0, 0, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN_REXT, FF_DXVA2_WORKAROUND_HEVC_REXT ),
- DEF_DXVA_MODE( "HEVC Main 12 profile 4:4:4 Range Extension (Intel)", &DXVA_ModeHEVC_VLD_Main444_12_Intel, 12, 0, 0, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN_REXT, FF_DXVA2_WORKAROUND_HEVC_REXT ),
-#endif
+ DEF_DXVA_MODE( "HEVC Main profile 4:2:2 Range Extension (Intel)", &DXVA_ModeHEVC_VLD_Main12_Intel, 8, 1, 0, AV_CODEC_ID_HEVC, NULL, 0 ),
+ DEF_DXVA_MODE( "HEVC Main 10 profile 4:2:2 Range Extension (Intel)", &DXVA_ModeHEVC_VLD_Main422_10_Intel, 10, 1, 0, AV_CODEC_ID_HEVC, NULL, 0 ),
+ DEF_DXVA_MODE( "HEVC Main 12 profile 4:2:2 Range Extension (Intel)", &DXVA_ModeHEVC_VLD_Main422_12_Intel, 12, 1, 0, AV_CODEC_ID_HEVC, NULL, 0 ),
+ DEF_DXVA_MODE( "HEVC Main profile 4:4:4 Range Extension (Intel)", &DXVA_ModeHEVC_VLD_Main444_Intel, 8, 0, 0, AV_CODEC_ID_HEVC, NULL, 0 ),
+ DEF_DXVA_MODE( "HEVC Main 10 profile 4:4:4 Range Extension (Intel)", &DXVA_ModeHEVC_VLD_Main444_10_Intel, 10, 0, 0, AV_CODEC_ID_HEVC, NULL, 0 ),
+ DEF_DXVA_MODE( "HEVC Main 12 profile 4:4:4 Range Extension (Intel)", &DXVA_ModeHEVC_VLD_Main444_12_Intel, 12, 0, 0, AV_CODEC_ID_HEVC, NULL, 0 ),
DEF_DXVA_MODE_420_8B( "HEVC Main profile", &DXVA_ModeHEVC_VLD_Main, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN ),
DEF_DXVA_MODE_420_10B( "HEVC Main 10 profile", &DXVA_ModeHEVC_VLD_Main10, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN10 ),
+ DEF_DXVA_MODE( "HEVC Main profile 4:2:2 Range Extension", &DXVA_ModeHEVC_VLD_Main12, 8, 1, 0, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN_REXT, 0 ),
+ DEF_DXVA_MODE( "HEVC Main 10 profile 4:2:2 Range Extension", &DXVA_ModeHEVC_VLD_Main10_422, 10, 1, 0, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN_REXT, 0 ),
+ DEF_DXVA_MODE( "HEVC Main 12 profile 4:2:2 Range Extension", &DXVA_ModeHEVC_VLD_Main12_422, 12, 1, 0, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN_REXT, 0 ),
+ DEF_DXVA_MODE( "HEVC Main profile 4:4:4 Range Extension", &DXVA_ModeHEVC_VLD_Main_444, 8, 0, 0, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN_REXT, 0 ),
+ DEF_DXVA_MODE( "HEVC Main 10 profile 4:4:4 Range Extension", &DXVA_ModeHEVC_VLD_Main10_444, 10, 0, 0, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN_REXT, 0 ),
+ DEF_DXVA_MODE( "HEVC Main 12 profile 4:4:4 Range Extension", &DXVA_ModeHEVC_VLD_Main12_444, 12, 0, 0, AV_CODEC_ID_HEVC, PROF_HEVC_MAIN_REXT, 0 ),
/* H.261 */
DEF_DXVA_MODE_420_8B_UNSUPPORTED( "H.261 decoder, restricted profile A", &DXVA_ModeH261_A ),
@@ -493,7 +505,7 @@ static const directx_va_mode_t * FindVideoServiceConversion(vlc_va_t *va, const
desc->log2_chroma_h != mode->log2_chroma_h ) )
{
char *psz_name = directx_va_GetDecoderName(mode->guid);
- msg_Warn( va, "Unsupported chroma subsampling 4:%d:%d for %s ",
+ msg_Warn( va, "Unsupported %s chroma subsampling 4:%d:%d for %s ", desc->name,
(2-desc->log2_chroma_w)*2, (2-desc->log2_chroma_w-desc->log2_chroma_h)*2, psz_name );
free( psz_name );
continue;
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/458047c391d5cb64b2858bdee1febf909500b0d0...abe84d61907f9aa9b59c05c945c54e562e7c55f1
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/458047c391d5cb64b2858bdee1febf909500b0d0...abe84d61907f9aa9b59c05c945c54e562e7c55f1
You're receiving this email because of your account on code.videolan.org.
More information about the vlc-commits
mailing list