From 8a2660dc7fc9001641427994900d760e853e2d93 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Thu, 23 Jun 2022 14:31:10 +0200 Subject: [PATCH] va: allocator: Use always lseek to get dmabuf size. Gallium drivers historically have reported strange dmabuf sizes, from always zero to the whole frame (multiple fds). The simplest solution is to use lseek SEEK_END to get the prime descriptor size. Also the allocator raises a warning if both values differ in order to report it to driver. Part-of: --- subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c b/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c index e541426..fb26ef7 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c @@ -594,11 +594,18 @@ gst_va_dmabuf_allocator_setup_buffer_full (GstAllocator * allocator, for (i = 0; i < desc.num_objects; i++) { gint fd = desc.objects[i].fd; - gsize size = desc.objects[i].size > 0 ? - desc.objects[i].size : _get_fd_size (fd); + /* don't rely on prime descriptor reported size since gallium drivers report + * different values */ + gsize size = _get_fd_size (fd); GstMemory *mem = gst_dmabuf_allocator_alloc (allocator, fd, size); guint64 *drm_mod = g_new (guint64, 1); + if (size != desc.objects[i].size) { + GST_WARNING_OBJECT (self, "driver bug: fd size (%" G_GSIZE_FORMAT + ") differs from object descriptor size (%" G_GUINT32_FORMAT ")", + size, desc.objects[i].size); + } + object_offset[i] = gst_buffer_get_size (buffer); gst_buffer_append_memory (buffer, mem); buf->mems[i] = mem; -- 2.7.4