summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Boxer <boxerab@protonmail.com>2022-11-01 10:51:50 -0400
committerDudemanguy <random342@airmail.cc>2022-11-07 16:42:01 +0000
commit00e3c90fb111d007ced1040d51c3b81b3280418c (patch)
treea6ecf7c2d7183e14cd1366dd3e8cc6d9725b577c
parent259eda4e2f5c02eef979123903c7661b0201fb44 (diff)
downloadmpv-00e3c90fb111d007ced1040d51c3b81b3280418c.tar.bz2
mpv-00e3c90fb111d007ced1040d51c3b81b3280418c.tar.xz
vo_dmabuf_wayland: improve error handling exporting VA surface
1. check for all error conditions when calling vaExportSurfaceHandle 2. only clean up valid descriptors
-rw-r--r--video/out/vo_dmabuf_wayland.c48
1 files changed, 25 insertions, 23 deletions
diff --git a/video/out/vo_dmabuf_wayland.c b/video/out/vo_dmabuf_wayland.c
index fe320de884..a1a845bd9c 100644
--- a/video/out/vo_dmabuf_wayland.c
+++ b/video/out/vo_dmabuf_wayland.c
@@ -73,37 +73,39 @@ static bool vaapi_dmabuf_importer(struct mp_image *src, struct wlbuf_pool_entry*
struct zwp_linux_buffer_params_v1 *params)
{
struct priv *p = entry->vo->priv;
- VADRMPRIMESurfaceDescriptor desc;
- bool dmabuf_imported = false;
+ VADRMPRIMESurfaceDescriptor desc = { 0 };
/* composed has single layer */
int layer_no = 0;
VAStatus status = vaExportSurfaceHandle(p->display, entry->key, VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2,
VA_EXPORT_SURFACE_COMPOSED_LAYERS | VA_EXPORT_SURFACE_READ_ONLY, &desc);
- if (status == VA_STATUS_ERROR_INVALID_SURFACE) {
- MP_VERBOSE(entry->vo, "VA export to composed layers not supported.\n");
- } else if (!vo_wayland_supported_format(entry->vo, desc.layers[0].drm_format, desc.objects[0].drm_format_modifier)) {
+
+ if (!CHECK_VA_STATUS(entry->vo, "vaExportSurfaceHandle()")) {
+ /* invalid surface warning => composed layers not supported */
+ if (status == VA_STATUS_ERROR_INVALID_SURFACE)
+ MP_VERBOSE(entry->vo, "vaExportSurfaceHandle: composed layers not supported.\n");
+ return false;
+ }
+ bool success = false;
+ uint32_t drm_format = desc.layers[layer_no].drm_format;
+ if (!vo_wayland_supported_format(entry->vo, drm_format, desc.objects[0].drm_format_modifier)) {
MP_VERBOSE(entry->vo, "%s(%016lx) is not supported.\n",
- mp_tag_str(desc.layers[0].drm_format), desc.objects[0].drm_format_modifier);
- } else if (CHECK_VA_STATUS(entry->vo, "vaExportSurfaceHandle()")) {
- entry->drm_format = desc.layers[layer_no].drm_format;
- for (int plane_no = 0; plane_no < desc.layers[layer_no].num_planes; ++plane_no) {
- int object = desc.layers[layer_no].object_index[plane_no];
- uint64_t modifier = desc.objects[object].drm_format_modifier;
- zwp_linux_buffer_params_v1_add(params, desc.objects[object].fd, plane_no, desc.layers[layer_no].offset[plane_no],
- desc.layers[layer_no].pitch[plane_no], modifier >> 32, modifier & 0xffffffff);
- }
- dmabuf_imported = true;
+ mp_tag_str(drm_format), desc.objects[0].drm_format_modifier);
+ goto done;
}
-
- /* clean up descriptor */
- if (status != VA_STATUS_ERROR_INVALID_SURFACE) {
- for (int i = 0; i < desc.num_objects; i++) {
- close(desc.objects[i].fd);
- desc.objects[i].fd = 0;
- }
+ entry->drm_format = drm_format;
+ for (int plane_no = 0; plane_no < desc.layers[layer_no].num_planes; ++plane_no) {
+ int object = desc.layers[layer_no].object_index[plane_no];
+ uint64_t modifier = desc.objects[object].drm_format_modifier;
+ zwp_linux_buffer_params_v1_add(params, desc.objects[object].fd, plane_no, desc.layers[layer_no].offset[plane_no],
+ desc.layers[layer_no].pitch[plane_no], modifier >> 32, modifier & 0xffffffff);
}
+ success = true;
+
+done:
+ for (int i = 0; i < desc.num_objects; i++)
+ close(desc.objects[i].fd);
- return dmabuf_imported;
+ return success;
}
#endif