Skip to content

Commit

Permalink
MPCVideoDec - добавлена поддержка в D3D11 нативном декодере HEVC_VLD_…
Browse files Browse the repository at this point in the history
…MAIN12, HEVC_VLD_MAIN10_422, HEVC_VLD_MAIN12_422, HEVC_VLD_MAIN_444, HEVC_VLD_MAIN10_444, HEVC_VLD_MAIN12_444. Эти режимы добавили Nvidia и Intel(помимо своих Intel специфичных) в свои драйвера.

Intel проверено все.
Nvidia проверено кроме 422 режимов, т.к. их поддерживает только 5xxx серия (а таковой не имеется на руках), так же не работает HEVC_VLD_MAIN12 т.к. он требует какого-то "особого" подхода - нафиг :).
  • Loading branch information
Aleksoid1978 committed Mar 3, 2025
1 parent acb58f8 commit 466ce6a
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 7 deletions.
13 changes: 12 additions & 1 deletion include/dxva2_guids.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* (C) 2024 see Authors.txt
* (C) 2024-2025 see Authors.txt
*
* This file is part of MPC-BE.
*
Expand All @@ -20,6 +20,8 @@

#pragma once

#include <d3d11.h>

// Additionnal DXVA2 GUIDs


Expand Down Expand Up @@ -85,3 +87,12 @@ DEFINE_GUID(DXVA2_HEVC_VLD_Main444_10_Intel, 0x6A6A81BA, 0x912A, 0x485D, 0xB5, 0

// {5B08E35D-0C66-4C51-A6F1-89D00CB2C197}
DEFINE_GUID(DXVA2_HEVC_VLD_Main444_12_Intel, 0x5B08E35D, 0x0C66, 0x4C51, 0xA6, 0xF1, 0x89, 0xD0, 0x0C, 0xB2, 0xC1, 0x97);

#if !defined(NTDDI_WIN11_GE)
DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12, 0x1a72925f, 0x0c2c, 0x4f15, 0x96, 0xfb, 0xb1, 0x7d, 0x14, 0x73, 0x60, 0x3f);
DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN10_422, 0x0bac4fe5, 0x1532, 0x4429, 0xa8, 0x54, 0xf8, 0x4d, 0xe0, 0x49, 0x53, 0xdb);
DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12_422, 0x55bcac81, 0xf311, 0x4093, 0xa7, 0xd0, 0x1c, 0xbc, 0x0b, 0x84, 0x9b, 0xee);
DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN_444, 0x4008018f, 0xf537, 0x4b36, 0x98, 0xcf, 0x61, 0xaf, 0x8a, 0x2c, 0x1a, 0x33);
DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN10_444, 0x0dabeffa, 0x4458, 0x4602, 0xbc, 0x03, 0x07, 0x95, 0x65, 0x9d, 0x61, 0x7c);
DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12_444, 0x9798634d, 0xfe9d, 0x48e5, 0xb4, 0xda, 0xdb, 0xec, 0x45, 0xb3, 0xdf, 0x01);
#endif
9 changes: 8 additions & 1 deletion src/DSUtil/DSUtil.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* (C) 2003-2006 Gabest
* (C) 2006-2024 see Authors.txt
* (C) 2006-2025 see Authors.txt
*
* This file is part of MPC-BE.
*
Expand Down Expand Up @@ -1831,6 +1831,13 @@ static const struct {
// HEVC
{&DXVA2_ModeHEVC_VLD_Main, L"HEVC"},
{&DXVA2_ModeHEVC_VLD_Main10, L"HEVC 10-bit"},

{&D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12, L"HEVC 12-bit"},
{&D3D11_DECODER_PROFILE_HEVC_VLD_MAIN10_422, L"HEVC 422 10-bit"},
{&D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12_422, L"HEVC 422 12-bit"},
{&D3D11_DECODER_PROFILE_HEVC_VLD_MAIN_444, L"HEVC 444 8-bit"},
{&D3D11_DECODER_PROFILE_HEVC_VLD_MAIN10_444, L"HEVC 444 10-bit"},
{&D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12_444, L"HEVC 444 12-bit"},
// VP8
{&DXVA2_ModeVP8_VLD, L"VP8"},
// VP9
Expand Down
8 changes: 7 additions & 1 deletion src/DSUtil/MediaTypeEx.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* (C) 2003-2006 Gabest
* (C) 2006-2024 see Authors.txt
* (C) 2006-2025 see Authors.txt
*
* This file is part of MPC-BE.
*
Expand Down Expand Up @@ -252,6 +252,12 @@ static const std::map<GUID, LPCSTR> dxvaguids = {
ADDENTRY(DXVA2_HEVC_VLD_Main444_Intel)
ADDENTRY(DXVA2_HEVC_VLD_Main444_10_Intel)
ADDENTRY(DXVA2_HEVC_VLD_Main444_12_Intel)
ADDENTRY(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12)
ADDENTRY(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN10_422)
ADDENTRY(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12_422)
ADDENTRY(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN_444)
ADDENTRY(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN10_444)
ADDENTRY(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12_444)
};
#undef ADDENTRY

Expand Down
17 changes: 13 additions & 4 deletions src/filters/transform/MPCVideoDec/MPCVideoDec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,13 @@ struct {
{ AV_CODEC_ID_H264, DXVA2_ModeH264_E, false },
{ AV_CODEC_ID_H264, DXVA2_ModeH264_F, false },
{ AV_CODEC_ID_H264, DXVA2_H264_VLD_Intel, false },
// HEVC Rext
{ AV_CODEC_ID_HEVC, D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12, false, AV_PIX_FMT_YUV420P12 },
{ AV_CODEC_ID_HEVC, D3D11_DECODER_PROFILE_HEVC_VLD_MAIN10_422, false, AV_PIX_FMT_YUV422P10 },
{ AV_CODEC_ID_HEVC, D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12_422, false, AV_PIX_FMT_YUV422P12 },
{ AV_CODEC_ID_HEVC, D3D11_DECODER_PROFILE_HEVC_VLD_MAIN_444, false, AV_PIX_FMT_YUV444P },
{ AV_CODEC_ID_HEVC, D3D11_DECODER_PROFILE_HEVC_VLD_MAIN10_444, false, AV_PIX_FMT_YUV444P10 },
{ AV_CODEC_ID_HEVC, D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12_444, false, AV_PIX_FMT_YUV444P12 },
// HEVC Intel
{ AV_CODEC_ID_HEVC, DXVA2_HEVC_VLD_Main12_Intel, false, AV_PIX_FMT_YUV420P12 },
{ AV_CODEC_ID_HEVC, DXVA2_HEVC_VLD_Main422_10_Intel, false, AV_PIX_FMT_YUV422P },
Expand Down Expand Up @@ -4173,10 +4180,12 @@ BOOL CMPCVideoDecFilter::IsSupportedDecoderMode(const GUID& decoderGUID)
for (const auto& mode : DXVAModes) {
if (mode.nCodecId == m_CodecId
&& mode.decoderGUID == decoderGUID) {
if (mode.pixFormat != AV_PIX_FMT_NONE && m_hwType == HwType::D3D11 && m_pAVCtx->profile == FF_PROFILE_HEVC_REXT) {
const enum AVPixelFormat pix_fmt = (m_pAVCtx->sw_pix_fmt != AV_PIX_FMT_NONE) ? m_pAVCtx->sw_pix_fmt : m_pAVCtx->pix_fmt;
if (mode.pixFormat == pix_fmt) {
return TRUE;
if (m_pAVCtx->codec_id == AV_CODEC_ID_HEVC && m_pAVCtx->profile == FF_PROFILE_HEVC_REXT) {
if (mode.pixFormat != AV_PIX_FMT_NONE) {
const auto pix_fmt = (m_pAVCtx->sw_pix_fmt != AV_PIX_FMT_NONE) ? m_pAVCtx->sw_pix_fmt : m_pAVCtx->pix_fmt;
if (mode.pixFormat == pix_fmt) {
return TRUE;
}
}
} else if (mode.bHighBitdepth == m_bHighBitdepth) {
return TRUE;
Expand Down

0 comments on commit 466ce6a

Please sign in to comment.