mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-22 02:13:46 +00:00
va: allocator: Decide the allocator's parameters when set_format().
Moving the parameters testing and setting from the allocator_alloc_full() to the allocator_try(). The allocator_alloc_full() will be called every time when we need to allocate a new memory. But all these parameters such as the surface and the image format, rt_format, etc, are unchanged during the whole allocator lifetime. Just setting them in set_format() is enough. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1698>
This commit is contained in:
parent
77f28ee3e7
commit
16ff523575
1 changed files with 38 additions and 23 deletions
|
@ -839,6 +839,11 @@ struct _GstVaAllocator
|
||||||
gboolean use_derived;
|
gboolean use_derived;
|
||||||
GArray *surface_formats;
|
GArray *surface_formats;
|
||||||
|
|
||||||
|
GstVideoFormat surface_format;
|
||||||
|
GstVideoFormat img_format;
|
||||||
|
guint32 fourcc;
|
||||||
|
guint32 rt_format;
|
||||||
|
|
||||||
GCond buffer_cond;
|
GCond buffer_cond;
|
||||||
|
|
||||||
GstVideoInfo info;
|
GstVideoInfo info;
|
||||||
|
@ -1189,34 +1194,13 @@ gst_va_allocator_alloc_full (GstAllocator * allocator, GstVideoInfo * info)
|
||||||
{
|
{
|
||||||
GstVaAllocator *self;
|
GstVaAllocator *self;
|
||||||
GstVaMemory *mem;
|
GstVaMemory *mem;
|
||||||
GstVideoFormat format, img_format;
|
|
||||||
VASurfaceID surface;
|
VASurfaceID surface;
|
||||||
guint32 fourcc, rt_format;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_VA_ALLOCATOR (allocator), NULL);
|
g_return_val_if_fail (GST_IS_VA_ALLOCATOR (allocator), NULL);
|
||||||
|
|
||||||
self = GST_VA_ALLOCATOR (allocator);
|
self = GST_VA_ALLOCATOR (allocator);
|
||||||
|
|
||||||
img_format = GST_VIDEO_INFO_FORMAT (&self->info);
|
if (!_create_surfaces (self->display, self->rt_format, self->fourcc,
|
||||||
|
|
||||||
format = gst_va_video_surface_format_from_image_format (img_format,
|
|
||||||
self->surface_formats);
|
|
||||||
if (format == GST_VIDEO_FORMAT_UNKNOWN) {
|
|
||||||
/* try a surface without fourcc but rt_format only */
|
|
||||||
fourcc = 0;
|
|
||||||
rt_format = gst_va_chroma_from_video_format (img_format);
|
|
||||||
} else {
|
|
||||||
fourcc = gst_va_fourcc_from_video_format (format);
|
|
||||||
rt_format = gst_va_chroma_from_video_format (format);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rt_format == 0) {
|
|
||||||
GST_ERROR_OBJECT (allocator, "Unsupported image format: %s",
|
|
||||||
gst_video_format_to_string (img_format));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_create_surfaces (self->display, rt_format, fourcc,
|
|
||||||
GST_VIDEO_INFO_WIDTH (&self->info),
|
GST_VIDEO_INFO_WIDTH (&self->info),
|
||||||
GST_VIDEO_INFO_HEIGHT (&self->info), self->usage_hint, NULL,
|
GST_VIDEO_INFO_HEIGHT (&self->info), self->usage_hint, NULL,
|
||||||
&surface, 1))
|
&surface, 1))
|
||||||
|
@ -1233,7 +1217,7 @@ gst_va_allocator_alloc_full (GstAllocator * allocator, GstVideoInfo * info)
|
||||||
mem = g_slice_new (GstVaMemory);
|
mem = g_slice_new (GstVaMemory);
|
||||||
|
|
||||||
mem->surface = surface;
|
mem->surface = surface;
|
||||||
mem->surface_format = format;
|
mem->surface_format = self->surface_format;
|
||||||
|
|
||||||
_reset_mem (mem, allocator, GST_VIDEO_INFO_SIZE (&self->info));
|
_reset_mem (mem, allocator, GST_VIDEO_INFO_SIZE (&self->info));
|
||||||
|
|
||||||
|
@ -1311,12 +1295,43 @@ gst_va_allocator_try (GstAllocator * allocator)
|
||||||
GstVaAllocator *self = GST_VA_ALLOCATOR (allocator);
|
GstVaAllocator *self = GST_VA_ALLOCATOR (allocator);
|
||||||
GstVideoInfo info = self->info;
|
GstVideoInfo info = self->info;
|
||||||
|
|
||||||
|
self->fourcc = 0;
|
||||||
|
self->rt_format = 0;
|
||||||
|
self->use_derived = FALSE;
|
||||||
|
self->img_format = GST_VIDEO_INFO_FORMAT (&self->info);
|
||||||
|
|
||||||
|
self->surface_format =
|
||||||
|
gst_va_video_surface_format_from_image_format (self->img_format,
|
||||||
|
self->surface_formats);
|
||||||
|
if (self->surface_format == GST_VIDEO_FORMAT_UNKNOWN) {
|
||||||
|
/* try a surface without fourcc but rt_format only */
|
||||||
|
self->fourcc = 0;
|
||||||
|
self->rt_format = gst_va_chroma_from_video_format (self->img_format);
|
||||||
|
} else {
|
||||||
|
self->fourcc = gst_va_fourcc_from_video_format (self->surface_format);
|
||||||
|
self->rt_format = gst_va_chroma_from_video_format (self->surface_format);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self->rt_format == 0) {
|
||||||
|
GST_ERROR_OBJECT (allocator, "Unsupported image format: %s",
|
||||||
|
gst_video_format_to_string (self->img_format));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
mem = gst_va_allocator_alloc_full (allocator, &info);
|
mem = gst_va_allocator_alloc_full (allocator, &info);
|
||||||
if (!mem)
|
if (!mem)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
gst_memory_unref (mem);
|
gst_memory_unref (mem);
|
||||||
|
|
||||||
self->info = info;
|
self->info = info;
|
||||||
|
|
||||||
|
GST_INFO_OBJECT (self,
|
||||||
|
"va allocator info, surface format: %s, image format: %s, "
|
||||||
|
"use derived: %s, rt format: 0x%x, fourcc: %" GST_FOURCC_FORMAT,
|
||||||
|
gst_video_format_to_string (self->surface_format),
|
||||||
|
gst_video_format_to_string (self->img_format),
|
||||||
|
self->use_derived ? "true" : "false", self->rt_format,
|
||||||
|
GST_FOURCC_ARGS (self->fourcc));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue