mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 15:08:53 +00:00
vaapipluginbase: dmabuf memory map trial for raw caps
Only push dmabuf-based buffers with raw caps if gst_memory_map() succeeds. Otherwise, use the the vaapi surfaces allocator. https://bugzilla.gnome.org/show_bug.cgi?id=755072 https://bugzilla.gnome.org/show_bug.cgi?id=774649 Original-patch-by: Julien Isorce <j.isorce@samsung.com>
This commit is contained in:
parent
5312923d1c
commit
f578515988
1 changed files with 29 additions and 7 deletions
|
@ -569,6 +569,31 @@ get_dmabuf_surface_allocation_flags (void)
|
||||||
return GST_VAAPI_SURFACE_ALLOC_FLAG_LINEAR_STORAGE;
|
return GST_VAAPI_SURFACE_ALLOC_FLAG_LINEAR_STORAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline GstAllocator *
|
||||||
|
create_dmabuf_srcpad_allocator (GstVaapiPluginBase * plugin,
|
||||||
|
GstVideoInfo * vinfo, gboolean check_for_map)
|
||||||
|
{
|
||||||
|
GstAllocator *allocator;
|
||||||
|
|
||||||
|
if (!GST_IS_VIDEO_DECODER (plugin) && !GST_IS_BASE_TRANSFORM (plugin))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
allocator = gst_vaapi_dmabuf_allocator_new (plugin->display, vinfo,
|
||||||
|
get_dmabuf_surface_allocation_flags (), GST_PAD_SRC);
|
||||||
|
if (!allocator || !check_for_map)
|
||||||
|
return allocator;
|
||||||
|
|
||||||
|
/* the dmabuf allocator *must* be capable to map a buffer with raw
|
||||||
|
* caps and the there's no evidence of downstream dmabuf
|
||||||
|
* importation */
|
||||||
|
if (!gst_vaapi_dmabuf_can_map (plugin->display, allocator)) {
|
||||||
|
GST_INFO_OBJECT (plugin, "dmabuf allocator generates unmappable buffers");
|
||||||
|
gst_object_replace ((GstObject **) & allocator, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return allocator;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
ensure_srcpad_allocator (GstVaapiPluginBase * plugin, GstVideoInfo * vinfo,
|
ensure_srcpad_allocator (GstVaapiPluginBase * plugin, GstVideoInfo * vinfo,
|
||||||
GstCaps * caps)
|
GstCaps * caps)
|
||||||
|
@ -583,16 +608,13 @@ ensure_srcpad_allocator (GstVaapiPluginBase * plugin, GstVideoInfo * vinfo,
|
||||||
|
|
||||||
plugin->srcpad_allocator = NULL;
|
plugin->srcpad_allocator = NULL;
|
||||||
if (caps && gst_caps_is_video_raw (caps)) {
|
if (caps && gst_caps_is_video_raw (caps)) {
|
||||||
if (plugin->srcpad_can_dmabuf) {
|
GstAllocator *allocator = create_dmabuf_srcpad_allocator (plugin, vinfo,
|
||||||
if (GST_IS_VIDEO_DECODER (plugin) || GST_IS_BASE_TRANSFORM (plugin)) {
|
!plugin->srcpad_can_dmabuf);
|
||||||
plugin->srcpad_allocator =
|
if (!allocator && plugin->enable_direct_rendering) {
|
||||||
gst_vaapi_dmabuf_allocator_new (plugin->display, vinfo,
|
|
||||||
get_dmabuf_surface_allocation_flags (), GST_PAD_SRC);
|
|
||||||
}
|
|
||||||
} else if (plugin->enable_direct_rendering) {
|
|
||||||
usage_flag = GST_VAAPI_IMAGE_USAGE_FLAG_DIRECT_RENDER;
|
usage_flag = GST_VAAPI_IMAGE_USAGE_FLAG_DIRECT_RENDER;
|
||||||
GST_INFO_OBJECT (plugin, "enabling direct rendering in source allocator");
|
GST_INFO_OBJECT (plugin, "enabling direct rendering in source allocator");
|
||||||
}
|
}
|
||||||
|
plugin->srcpad_allocator = allocator;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!plugin->srcpad_allocator) {
|
if (!plugin->srcpad_allocator) {
|
||||||
|
|
Loading…
Reference in a new issue