vf_d3d11vpp: add support for scaling

Adds `--vf=d3d11vpp=scale` to scale video using d3d11 video processor.

Co-authored-by: xc <wxc9312@gmail.com>
This commit is contained in:
Kacper Michajłow 2024-08-19 16:46:47 +02:00
parent 67e087dcae
commit bbb3d5ba78
3 changed files with 26 additions and 6 deletions

View File

@ -0,0 +1 @@
add `--vf=d3d11vpp=scale`

View File

@ -692,6 +692,8 @@ Available mpv-only filters are:
``deint=<yes|no>``
Whether deinterlacing is enabled (default: no).
``scale``
Scaling factor for the video frames (default: 1.0).
``interlaced-only=<yes|no>``
If ``yes``, only deinterlace frames marked as interlaced (default: no).
``mode=<blend|bob|adaptive|mocomp|ivctc|none>``

View File

@ -44,6 +44,7 @@
struct opts {
bool deint_enabled;
float scale;
bool interlaced_only;
int mode;
int field_parity;
@ -145,8 +146,8 @@ static int recreate_video_proc(struct mp_filter *vf)
.InputFrameFormat = p->d3d_frame_format,
.InputWidth = p->c_w,
.InputHeight = p->c_h,
.OutputWidth = p->params.w,
.OutputHeight = p->params.h,
.OutputWidth = p->out_params.w,
.OutputHeight = p->out_params.h,
};
hr = ID3D11VideoDevice_CreateVideoProcessorEnumerator(p->video_dev, &vpdesc,
&p->vp_enum);
@ -235,7 +236,7 @@ static struct mp_image *render(struct mp_filter *vf)
ID3D11VideoProcessorInputView *in_view = NULL;
ID3D11VideoProcessorOutputView *out_view = NULL;
struct mp_image *in = NULL, *out = NULL;
out = mp_image_pool_get(p->pool, IMGFMT_D3D11, p->params.w, p->params.h);
out = mp_image_pool_get(p->pool, IMGFMT_D3D11, p->out_params.w, p->out_params.h);
if (!out) {
MP_WARN(vf, "failed to allocate frame\n");
goto cleanup;
@ -250,6 +251,12 @@ static struct mp_image *render(struct mp_filter *vf)
int d3d_subindex = (intptr_t)in->planes[1];
mp_image_copy_attributes(out, in);
// mp_image_copy_attributes overwrites the height and width
// set it the size back if we are using scale
mp_image_set_size(out, p->out_params.w, p->out_params.h);
// mp_image_copy_attributes will set the crop value to the origin
// width and height, set the crop back to the default state
out->params.crop = p->out_params.crop;
D3D11_VIDEO_FRAME_FORMAT d3d_frame_format;
if (!mp_refqueue_should_deint(p->queue)) {
@ -346,11 +353,19 @@ static void vf_d3d11vpp_process(struct mp_filter *vf)
p->params = in_fmt->params;
p->out_params = p->params;
p->out_params.w = lrintf(p->opts->scale * p->params.w);
p->out_params.h = lrintf(p->opts->scale * p->params.h);
p->out_params.crop.x0 = lrintf(p->opts->scale * p->out_params.crop.x0);
p->out_params.crop.x1 = lrintf(p->opts->scale * p->out_params.crop.x1);
p->out_params.crop.y0 = lrintf(p->opts->scale * p->out_params.crop.y0);
p->out_params.crop.y1 = lrintf(p->opts->scale * p->out_params.crop.y1);
p->out_params.hw_subfmt = IMGFMT_NV12;
p->out_format = DXGI_FORMAT_NV12;
p->require_filtering = p->params.hw_subfmt != p->out_params.hw_subfmt;
p->require_filtering = p->params.hw_subfmt != p->out_params.hw_subfmt ||
p->params.w != p->out_params.w ||
p->params.h != p->out_params.h;
}
if (!mp_refqueue_can_output(p->queue))
@ -483,6 +498,7 @@ fail:
#define OPT_BASE_STRUCT struct opts
static const m_option_t vf_opts_fields[] = {
{"deint", OPT_BOOL(deint_enabled)},
{"scale", OPT_FLOAT(scale)},
{"interlaced-only", OPT_BOOL(interlaced_only)},
{"mode", OPT_CHOICE(mode,
{"blend", D3D11_VIDEO_PROCESSOR_PROCESSOR_CAPS_DEINTERLACE_BLEND},
@ -504,8 +520,9 @@ const struct mp_user_filter_entry vf_d3d11vpp = {
.name = "d3d11vpp",
.priv_size = sizeof(OPT_BASE_STRUCT),
.priv_defaults = &(const OPT_BASE_STRUCT) {
.deint_enabled = true,
.mode = D3D11_VIDEO_PROCESSOR_PROCESSOR_CAPS_DEINTERLACE_BOB,
.deint_enabled = false,
.scale = 1.0,
.mode = 0,
.field_parity = MP_FIELD_PARITY_AUTO,
},
.options = vf_opts_fields,