plugins: allow bufferpool to not allocate vaapi video meta.

Add GST_VAAPI_VIDEO_BUFFER_POOL_ACQUIRE_FLAG_NO_ALLOC params flag that
can be used to disable early allocations of vaapi video metas on buffers,
thus delagating that to the bufferpool user.
This commit is contained in:
Gwenole Beauchesne 2014-08-21 11:12:39 +02:00
parent 038d56bdca
commit 1ef5a3a200
3 changed files with 37 additions and 8 deletions

View file

@ -216,21 +216,29 @@ gst_vaapi_video_buffer_pool_alloc_buffer (GstBufferPool * pool,
GstMemory *mem; GstMemory *mem;
GstBuffer *buffer; GstBuffer *buffer;
const gboolean alloc_vaapi_video_meta = !params ||
!(params->flags & GST_VAAPI_VIDEO_BUFFER_POOL_ACQUIRE_FLAG_NO_ALLOC);
if (!priv->allocator) if (!priv->allocator)
goto error_no_allocator; goto error_no_allocator;
if (alloc_vaapi_video_meta) {
meta = gst_vaapi_video_meta_new (priv->display); meta = gst_vaapi_video_meta_new (priv->display);
if (!meta) if (!meta)
goto error_create_meta; goto error_create_meta;
buffer = gst_vaapi_video_buffer_new (meta); buffer = gst_vaapi_video_buffer_new (meta);
} else {
meta = NULL;
buffer = gst_vaapi_video_buffer_new_empty ();
}
if (!buffer) if (!buffer)
goto error_create_buffer; goto error_create_buffer;
mem = gst_vaapi_video_memory_new (priv->allocator, meta); mem = gst_vaapi_video_memory_new (priv->allocator, meta);
if (!mem) if (!mem)
goto error_create_memory; goto error_create_memory;
gst_vaapi_video_meta_unref (meta); gst_vaapi_video_meta_replace (&meta, NULL);
gst_buffer_append_memory (buffer, mem); gst_buffer_append_memory (buffer, mem);
if (priv->has_video_meta) { if (priv->has_video_meta) {

View file

@ -69,6 +69,20 @@ typedef struct _GstVaapiVideoBufferPoolPrivate GstVaapiVideoBufferPoolPrivate;
"GstBufferPoolOptionVideoGLTextureUploadMeta" "GstBufferPoolOptionVideoGLTextureUploadMeta"
#endif #endif
/**
* GstVaapiVideoBufferPoolAcquireFlags:
* @GST_VAAPI_VIDEO_BUFFER_POOL_ACQUIRE_FLAG_NO_ALLOC: option to
* request that vaapi video metadata are not initially allocated,
* but are subsequently provided by the user.
*
* The set of #GstVaapiVideoBufferPool specific flags for
* gst_buffer_pool_acquire_buffer().
*/
typedef enum {
GST_VAAPI_VIDEO_BUFFER_POOL_ACQUIRE_FLAG_NO_ALLOC =
GST_BUFFER_POOL_ACQUIRE_FLAG_LAST << 0,
} GstVaapiVideoBufferPoolAcquireFlags;
/** /**
* GstVaapiVideoBufferPool: * GstVaapiVideoBufferPool:
* *

View file

@ -281,7 +281,7 @@ gst_vaapi_video_memory_new (GstAllocator * base_allocator,
mem->surface = NULL; mem->surface = NULL;
mem->image_info = &allocator->image_info; mem->image_info = &allocator->image_info;
mem->image = NULL; mem->image = NULL;
mem->meta = gst_vaapi_video_meta_ref (meta); mem->meta = meta ? gst_vaapi_video_meta_ref (meta) : NULL;
mem->map_type = 0; mem->map_type = 0;
mem->map_count = 0; mem->map_count = 0;
mem->use_direct_rendering = allocator->has_direct_rendering; mem->use_direct_rendering = allocator->has_direct_rendering;
@ -294,7 +294,7 @@ gst_vaapi_video_memory_free (GstVaapiVideoMemory * mem)
mem->surface = NULL; mem->surface = NULL;
gst_vaapi_video_memory_reset_image (mem); gst_vaapi_video_memory_reset_image (mem);
gst_vaapi_surface_proxy_replace (&mem->proxy, NULL); gst_vaapi_surface_proxy_replace (&mem->proxy, NULL);
gst_vaapi_video_meta_unref (mem->meta); gst_vaapi_video_meta_replace (&mem->meta, NULL);
gst_object_unref (GST_MEMORY_CAST (mem)->allocator); gst_object_unref (GST_MEMORY_CAST (mem)->allocator);
g_slice_free (GstVaapiVideoMemory, mem); g_slice_free (GstVaapiVideoMemory, mem);
} }
@ -319,6 +319,7 @@ gst_vaapi_video_memory_reset_surface (GstVaapiVideoMemory * mem)
mem->surface = NULL; mem->surface = NULL;
gst_vaapi_video_memory_reset_image (mem); gst_vaapi_video_memory_reset_image (mem);
gst_vaapi_surface_proxy_replace (&mem->proxy, NULL); gst_vaapi_surface_proxy_replace (&mem->proxy, NULL);
if (mem->meta)
gst_vaapi_video_meta_set_surface_proxy (mem->meta, NULL); gst_vaapi_video_meta_set_surface_proxy (mem->meta, NULL);
} }
@ -328,6 +329,9 @@ gst_vaapi_video_memory_map (GstVaapiVideoMemory * mem, gsize maxsize,
{ {
gpointer data; gpointer data;
g_return_val_if_fail (mem, NULL);
g_return_val_if_fail (mem->meta, NULL);
if (mem->map_count == 0) { if (mem->map_count == 0) {
switch (flags & GST_MAP_READWRITE) { switch (flags & GST_MAP_READWRITE) {
case 0: case 0:
@ -426,6 +430,9 @@ gst_vaapi_video_memory_copy (GstVaapiVideoMemory * mem,
GstMemory *out_mem; GstMemory *out_mem;
gsize maxsize; gsize maxsize;
g_return_val_if_fail (mem, NULL);
g_return_val_if_fail (mem->meta, NULL);
/* XXX: this implements a soft-copy, i.e. underlying VA surfaces /* XXX: this implements a soft-copy, i.e. underlying VA surfaces
are not copied */ are not copied */
(void) gst_memory_get_sizes (GST_MEMORY_CAST (mem), NULL, &maxsize); (void) gst_memory_get_sizes (GST_MEMORY_CAST (mem), NULL, &maxsize);