Skip to content

Commit 996129d

Browse files
committed
Add support for D3D12 hwaccel (#114)
1 parent 4142f52 commit 996129d

7 files changed

Lines changed: 29 additions & 10 deletions

File tree

AviSynth/README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,11 @@
125125
- 0 : Use default software decoder.
126126
- 1 : Use NVIDIA CUVID acceleration for supported codec, otherwise use default software decoder.
127127
- 2 : Use Intel Quick Sync Video acceleration for supported codec, otherwise use default software decoder.
128-
- 3 : Try hardware decoder in the order of CUVID->QSV->DXVA2->D3D11VA->VULKAN. If none is available then use default software decoder.
128+
- 3 : Try hardware decoder in the order of CUVID->QSV->DXVA2->D3D11VA->D3D12VA->VULKAN. If none is available then use default software decoder.
129129
- 4 : Use DXVA2 hardware acceleration for supported codec, otherwise use default software decoder.
130130
- 5 : Use D3D11 hardware acceleration for supported codec, otherwise use default software decoder.
131-
- 6 : Use VULKAN hardware acceleration for supported codec, otherwise use default software decoder.
131+
- 6 : Use D3D12 hardware acceleration for supported codec, otherwise use default software decoder.
132+
- 7 : Use VULKAN hardware acceleration for supported codec, otherwise use default software decoder.
132133
The LWLDECODER variable can be used to see what decoder is used.
133134
+ ff_loglevel (default : 0)
134135
Set the log level in FFmpeg.

AviSynth/libavsmash_source.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@ LSMASHVideoSource::LSMASHVideoSource(const char* source, uint32_t track_number,
182182
return "HWAccel: DXVA2";
183183
case 5:
184184
return "HWAccel: D3D11VA";
185+
case 6:
186+
return "HWAccel: D3D12VA";
185187
default:
186188
return "HWAccel: VULKAN";
187189
}
@@ -449,7 +451,7 @@ AVSValue __cdecl CreateLSMASHVideoSource(AVSValue args, void* user_data, IScript
449451
seek_mode = CLIP_VALUE(seek_mode, 0, 2);
450452
forward_seek_threshold = CLIP_VALUE(forward_seek_threshold, 1, 999);
451453
direct_rendering &= (pixel_format == AV_PIX_FMT_NONE);
452-
prefer_hw_decoder = CLIP_VALUE(prefer_hw_decoder, 0, 6);
454+
prefer_hw_decoder = CLIP_VALUE(prefer_hw_decoder, 0, 7);
453455
set_av_log_level(ff_loglevel);
454456
return new LSMASHVideoSource(source, track_number, threads, seek_mode, forward_seek_threshold, direct_rendering, fps_num, fps_den,
455457
pixel_format, preferred_decoder_names, prefer_hw_decoder, ff_options, env);

AviSynth/lwlibav_source.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ LWLibavVideoSource::LWLibavVideoSource(lwlibav_option_t* opt, int seek_mode, uin
152152
return "HWAccel: DXVA2";
153153
case 5:
154154
return "HWAccel: D3D11VA";
155+
case 6:
156+
return "HWAccel: D3D12VA";
155157
default:
156158
return "HWAccel: VULKAN";
157159
}
@@ -463,7 +465,7 @@ AVSValue __cdecl CreateLWLibavVideoSource(AVSValue args, void* user_data, IScrip
463465
seek_mode = CLIP_VALUE(seek_mode, 0, 2);
464466
forward_seek_threshold = CLIP_VALUE(forward_seek_threshold, 1, 999);
465467
direct_rendering &= (pixel_format == AV_PIX_FMT_NONE);
466-
prefer_hw_decoder = CLIP_VALUE(prefer_hw_decoder, 0, 6);
468+
prefer_hw_decoder = CLIP_VALUE(prefer_hw_decoder, 0, 7);
467469
set_av_log_level(ff_loglevel);
468470
return new LWLibavVideoSource(&opt, seek_mode, forward_seek_threshold, direct_rendering, pixel_format, preferred_decoder_names,
469471
prefer_hw_decoder, progress, ff_options, env);

VapourSynth/README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,11 @@
104104
- 0 : Use default software decoder.
105105
- 1 : Use NVIDIA CUVID acceleration for supported codec, otherwise use default software decoder.
106106
- 2 : Use Intel Quick Sync Video acceleration for supported codec, otherwise use default software decoder.
107-
- 3 : Try hardware decoder in the order of CUVID->QSV->DXVA2->D3D11VA->VULKAN. If none is available then use default software decoder.
107+
- 3 : Try hardware decoder in the order of CUVID->QSV->DXVA2->D3D11VA->D3D12VA->VULKAN. If none is available then use default software decoder.
108108
- 4 : Use DXVA2 hardware acceleration for supported codec, otherwise use default software decoder.
109109
- 5 : Use D3D11 hardware acceleration for supported codec, otherwise use default software decoder.
110-
- 6 : Use VULKAN hardware acceleration for supported codec, otherwise use default software decoder.
110+
- 6 : Use D3D12 hardware acceleration for supported codec, otherwise use default software decoder.
111+
- 7 : Use VULKAN hardware acceleration for supported codec, otherwise use default software decoder.
111112
+ ff_loglevel (default : 0)
112113
Set the log level in FFmpeg.
113114
- 0 : AV_LOG_QUIET

VapourSynth/libavsmash_source.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ void VS_CC vs_libavsmashsource_create(const VSMap* in, VSMap* out, void* user_da
335335
libavsmash_video_set_seek_mode(vdhp, CLIP_VALUE(seek_mode, 0, 2));
336336
libavsmash_video_set_forward_seek_threshold(vdhp, CLIP_VALUE(seek_threshold, 1, 999));
337337
libavsmash_video_set_preferred_decoder_names(vdhp, tokenize_preferred_decoder_names(hp->preferred_decoder_names_buf));
338-
set_prefer_hw(&hp->prefer_hw, CLIP_VALUE(prefer_hw_decoder, 0, 6));
338+
set_prefer_hw(&hp->prefer_hw, CLIP_VALUE(prefer_hw_decoder, 0, 7));
339339
libavsmash_video_set_prefer_hw_decoder(vdhp, &hp->prefer_hw);
340340
libavsmash_video_set_decoder_options(vdhp, ff_options);
341341
vohp->vfr2cfr = (fps_num > 0 && fps_den > 0);

VapourSynth/lwlibav_source.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ void VS_CC vs_lwlibavsource_create(const VSMap* in, VSMap* out, void* user_data,
364364
lwlibav_video_set_seek_mode(vdhp, CLIP_VALUE(seek_mode, 0, 2));
365365
lwlibav_video_set_forward_seek_threshold(vdhp, CLIP_VALUE(seek_threshold, 1, 999));
366366
lwlibav_video_set_preferred_decoder_names(vdhp, tokenize_preferred_decoder_names(hp->preferred_decoder_names_buf));
367-
set_prefer_hw(&hp->prefer_hw, CLIP_VALUE(prefer_hw_decoder, 0, 6));
367+
set_prefer_hw(&hp->prefer_hw, CLIP_VALUE(prefer_hw_decoder, 0, 7));
368368
lwlibav_video_set_prefer_hw_decoder(vdhp, &hp->prefer_hw);
369369
lwlibav_video_set_decoder_options(vdhp, ff_options);
370370
vs_vohp->variable_info = CLIP_VALUE(variable_info, 0, 1);

common/decode.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,16 @@ static enum AVPixelFormat d3d11va_get_format(AVCodecContext* ctx, const enum AVP
129129
return AV_PIX_FMT_NONE;
130130
}
131131

132+
static enum AVPixelFormat d3d12va_get_format(AVCodecContext* ctx, const enum AVPixelFormat* pix_fmts)
133+
{
134+
while (*pix_fmts != AV_PIX_FMT_NONE) {
135+
if (*pix_fmts == AV_PIX_FMT_D3D12)
136+
return *pix_fmts;
137+
pix_fmts++;
138+
}
139+
return AV_PIX_FMT_NONE;
140+
}
141+
132142
static enum AVPixelFormat vulkan_get_format(AVCodecContext* ctx, const enum AVPixelFormat* pix_fmts)
133143
{
134144
while (*pix_fmts != AV_PIX_FMT_NONE) {
@@ -139,7 +149,7 @@ static enum AVPixelFormat vulkan_get_format(AVCodecContext* ctx, const enum AVPi
139149
return AV_PIX_FMT_NONE;
140150
}
141151

142-
static const char* hw_device_names[] = { [4] = "dxva2", [5] = "d3d11va", [6] = "vulkan" };
152+
static const char* hw_device_names[] = { "dxva2", "d3d11va", "d3d12va", "vulkan" };
143153

144154
int open_decoder(AVCodecContext** ctx, const AVCodecParameters* codecpar, const AVCodec* codec, const int thread_count, const double drc,
145155
const char* ff_options, int* prefer_hw_decoder, AVBufferRef* hw_device_ctx)
@@ -186,7 +196,7 @@ int open_decoder(AVCodecContext** ctx, const AVCodecParameters* codecpar, const
186196
enum AVPixelFormat hw_pix_fmt = AV_PIX_FMT_NONE;
187197
if (*prefer_hw_decoder == 3)
188198
++*prefer_hw_decoder;
189-
type = av_hwdevice_find_type_by_name(hw_device_names[*prefer_hw_decoder]);
199+
type = av_hwdevice_find_type_by_name(hw_device_names[*prefer_hw_decoder - 4]);
190200
if (type != AV_HWDEVICE_TYPE_NONE) {
191201
for (int i = 0;; ++i) {
192202
const AVCodecHWConfig* config = avcodec_get_hw_config(codec, i);
@@ -206,6 +216,9 @@ int open_decoder(AVCodecContext** ctx, const AVCodecParameters* codecpar, const
206216
case AV_PIX_FMT_D3D11:
207217
c->get_format = d3d11va_get_format;
208218
break;
219+
case AV_PIX_FMT_D3D12:
220+
c->get_format = d3d12va_get_format;
221+
break;
209222
default:
210223
c->get_format = vulkan_get_format;
211224
break;

0 commit comments

Comments
 (0)