diff options
author | Philip Langdale <philipl@overt.org> | 2022-02-06 14:18:59 -0800 |
---|---|---|
committer | Philip Langdale <github.philipl@overt.org> | 2022-02-17 20:02:32 -0800 |
commit | 5186651f304fb49867f2542d2eb149f8191cf0de (patch) | |
tree | c04acfdbf374bb4142c0c564a73aecd98082c977 /video/decode | |
parent | bc9805c71a67b2717c79533731608eff679cded1 (diff) | |
download | mpv-5186651f304fb49867f2542d2eb149f8191cf0de.tar.bz2 mpv-5186651f304fb49867f2542d2eb149f8191cf0de.tar.xz |
vo_gpu: hwdec: load hwdec interops on-demand by default
Historically, we have treated hwdec interop loading as a completely
separate step from loading the hwdecs themselves. Some hwdecs need an
interop, and some don't, and users generally configure the exact
hwdec they want, so interops that aren't relevant for that hwdec
shouldn't be loaded to save time and avoid warning/error spam.
The basic approach here is to recognise that interops are tied to
hwdecs by imgfmt. The hwdec outputs some format, and an interop is
needed to get that format to the vo without read back.
So, when we try to load an hwdec, instead of just blindly loading all
interops as we do today, let's pass the imgfmt in and only load
interops that work for that format. If more than one interop is
available for the format, the existing logic (whatever it is) will
continue to be used to pick one.
We also have one callsite in filters where we seem to pre-emptively
load all the interops. It's probably possible to trace down a specific
format but for now I'm just letting it keep loading all of them; it's
no worse than before.
You may notice there is no documentation update - and that's because
the current docs say that when the interop mode is `auto`, the interop
is loaded on demand. So reality now reflects the docs. How nice.
Diffstat (limited to 'video/decode')
-rw-r--r-- | video/decode/vd_lavc.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index 0e3afa1957..69769e3178 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -431,7 +431,8 @@ static AVBufferRef *hwdec_create_dev(struct mp_filter *vd, return ref; } } else if (ctx->hwdec_devs) { - hwdec_devices_request_all(ctx->hwdec_devs); + hwdec_devices_request_for_img_fmt(ctx->hwdec_devs, + pixfmt2imgfmt(hwdec->pix_fmt)); return hwdec_devices_get_lavc(ctx->hwdec_devs, hwdec->lavc_device); } @@ -510,7 +511,8 @@ static void select_and_set_hwdec(struct mp_filter *vd) // Most likely METHOD_INTERNAL, which often use delay-loaded // VO support as well. if (ctx->hwdec_devs) - hwdec_devices_request_all(ctx->hwdec_devs); + hwdec_devices_request_for_img_fmt( + ctx->hwdec_devs, pixfmt2imgfmt(hwdec->pix_fmt)); } ctx->use_hwdec = true; |