mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-03 04:52:28 +00:00
va: allocator: Fix translation of VADRMPRIMESurfaceDescriptor
VADRMPRIMESurfaceDescriptor structure describes the offsets from the point of view of the specific handle (DMABuf). While GstVideoInfo (and the meta) describes offsets from the point of the view of the GstBuffer, an aggregate of all the GstMemory (1 per handle). This changes combined with [Mesa Fix](https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16813) fixes decoding failure with AMD driver. Fixes #1223 Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2657>
This commit is contained in:
parent
3d160f4c9b
commit
9bcacb5ba4
1 changed files with 9 additions and 3 deletions
|
@ -513,6 +513,7 @@ gst_va_dmabuf_allocator_setup_buffer_full (GstAllocator * allocator,
|
|||
VASurfaceID surface;
|
||||
guint32 i, fourcc, rt_format, export_flags;
|
||||
GDestroyNotify buffer_destroy = NULL;
|
||||
gsize object_offset[4];
|
||||
|
||||
g_return_val_if_fail (GST_IS_VA_DMABUF_ALLOCATOR (allocator), FALSE);
|
||||
|
||||
|
@ -593,6 +594,7 @@ gst_va_dmabuf_allocator_setup_buffer_full (GstAllocator * allocator,
|
|||
GstMemory *mem = gst_dmabuf_allocator_alloc (allocator, fd, size);
|
||||
guint64 *drm_mod = g_new (guint64, 1);
|
||||
|
||||
object_offset[i] = gst_buffer_get_size (buffer);
|
||||
gst_buffer_append_memory (buffer, mem);
|
||||
buf->mems[i] = mem;
|
||||
|
||||
|
@ -615,18 +617,22 @@ gst_va_dmabuf_allocator_setup_buffer_full (GstAllocator * allocator,
|
|||
drm_mod, g_free);
|
||||
|
||||
if (G_UNLIKELY (info))
|
||||
GST_VIDEO_INFO_SIZE (info) += size;
|
||||
GST_VIDEO_INFO_PLANE_OFFSET (info, i) = GST_VIDEO_INFO_SIZE (info);
|
||||
|
||||
GST_LOG_OBJECT (self, "buffer %p: new dmabuf %d / surface %#x [%dx%d] "
|
||||
"size %" G_GSIZE_FORMAT " drm mod %#lx", buffer, fd, surface,
|
||||
GST_VIDEO_INFO_WIDTH (&self->info), GST_VIDEO_INFO_HEIGHT (&self->info),
|
||||
GST_VIDEO_INFO_SIZE (&self->info), *drm_mod);
|
||||
size, *drm_mod);
|
||||
}
|
||||
|
||||
if (G_UNLIKELY (info)) {
|
||||
GST_VIDEO_INFO_SIZE (info) = gst_buffer_get_size (buffer);
|
||||
|
||||
for (i = 0; i < desc.num_layers; i++) {
|
||||
g_assert (desc.layers[i].num_planes == 1);
|
||||
GST_VIDEO_INFO_PLANE_OFFSET (info, i) = desc.layers[i].offset[0];
|
||||
GST_VIDEO_INFO_PLANE_OFFSET (info, i) =
|
||||
object_offset[desc.layers[i].object_index[0]] +
|
||||
desc.layers[i].offset[0];
|
||||
GST_VIDEO_INFO_PLANE_STRIDE (info, i) = desc.layers[i].pitch[0];
|
||||
}
|
||||
} else {
|
||||
|
|
Loading…
Reference in a new issue