diff options
author | Philip Langdale <philipl@overt.org> | 2023-02-27 21:11:39 -0800 |
---|---|---|
committer | Philip Langdale <github.philipl@overt.org> | 2023-05-28 15:46:05 -0700 |
commit | 872b068cb75d6d3b173b3d60bf0b1cd375a6d20d (patch) | |
tree | dd576694c31ad805ab90d3de60c72a51f98bde6a /video/mp_image_pool.c | |
parent | 642dae1a6e0d8c09d09c49878275a026b5e2c6a9 (diff) | |
download | mpv-872b068cb75d6d3b173b3d60bf0b1cd375a6d20d.tar.bz2 mpv-872b068cb75d6d3b173b3d60bf0b1cd375a6d20d.tar.xz |
f_hwtransfer: disable vulkan multiplane images when uploading from cuda
Although we can support vulkan multiplane images, cuda lacks any such
support, and so cannot natively import such images for interop. It's
possible that we can do separate exports for each plane in the image
and have it work, but for now, we can selectively disable multiplane
when we know that we'll be consuming cuda frames.
As a reminder, even though cuda is the frame source, interop is one way
so the vulkan images have to be imported to cuda before we copy the
frame contents over.
This logic here is slightly more complex than I'd like but you can't
just set the flag blindly, as it will cause hwframes ctx creation to
fail if the format is packed or if it's planar rgb. Oh well.
Diffstat (limited to 'video/mp_image_pool.c')
-rw-r--r-- | video/mp_image_pool.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/video/mp_image_pool.c b/video/mp_image_pool.c index 2f0259146a..8f982b414c 100644 --- a/video/mp_image_pool.c +++ b/video/mp_image_pool.c @@ -15,6 +15,8 @@ * License along with mpv. If not, see <http://www.gnu.org/licenses/>. */ +#include "config.h" + #include <stddef.h> #include <stdbool.h> #include <pthread.h> @@ -22,7 +24,11 @@ #include <libavutil/buffer.h> #include <libavutil/hwcontext.h> +#if HAVE_VULKAN_INTEROP +#include <libavutil/hwcontext_vulkan.h> +#endif #include <libavutil/mem.h> +#include <libavutil/pixdesc.h> #include "mpv_talloc.h" @@ -354,7 +360,8 @@ done: bool mp_update_av_hw_frames_pool(struct AVBufferRef **hw_frames_ctx, struct AVBufferRef *hw_device_ctx, - int imgfmt, int sw_imgfmt, int w, int h) + int imgfmt, int sw_imgfmt, int w, int h, + bool disable_multiplane) { enum AVPixelFormat format = imgfmt2pixfmt(imgfmt); enum AVPixelFormat sw_format = imgfmt2pixfmt(sw_imgfmt); @@ -385,6 +392,18 @@ bool mp_update_av_hw_frames_pool(struct AVBufferRef **hw_frames_ctx, hw_frames->sw_format = sw_format; hw_frames->width = w; hw_frames->height = h; + +#if HAVE_VULKAN_INTEROP + if (format == AV_PIX_FMT_VULKAN && disable_multiplane) { + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(sw_format); + if ((desc->flags & AV_PIX_FMT_FLAG_PLANAR) && + !(desc->flags & AV_PIX_FMT_FLAG_RGB)) { + AVVulkanFramesContext *vk_frames = hw_frames->hwctx; + vk_frames->flags = AV_VK_FRAME_FLAG_DISABLE_MULTIPLANE; + } + } +#endif + if (av_hwframe_ctx_init(*hw_frames_ctx) < 0) { av_buffer_unref(hw_frames_ctx); return false; |