diff --git a/gst/vaapi/gstvaapivideobufferpool.c b/gst/vaapi/gstvaapivideobufferpool.c index 6e08ce1013..4c642e7d50 100644 --- a/gst/vaapi/gstvaapivideobufferpool.c +++ b/gst/vaapi/gstvaapivideobufferpool.c @@ -216,21 +216,29 @@ gst_vaapi_video_buffer_pool_alloc_buffer (GstBufferPool * pool, GstMemory *mem; GstBuffer *buffer; + const gboolean alloc_vaapi_video_meta = !params || + !(params->flags & GST_VAAPI_VIDEO_BUFFER_POOL_ACQUIRE_FLAG_NO_ALLOC); + if (!priv->allocator) goto error_no_allocator; - meta = gst_vaapi_video_meta_new (priv->display); - if (!meta) - goto error_create_meta; + if (alloc_vaapi_video_meta) { + meta = gst_vaapi_video_meta_new (priv->display); + if (!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) goto error_create_buffer; mem = gst_vaapi_video_memory_new (priv->allocator, meta); if (!mem) goto error_create_memory; - gst_vaapi_video_meta_unref (meta); + gst_vaapi_video_meta_replace (&meta, NULL); gst_buffer_append_memory (buffer, mem); if (priv->has_video_meta) { diff --git a/gst/vaapi/gstvaapivideobufferpool.h b/gst/vaapi/gstvaapivideobufferpool.h index ed8e1c7e07..7ced82bade 100644 --- a/gst/vaapi/gstvaapivideobufferpool.h +++ b/gst/vaapi/gstvaapivideobufferpool.h @@ -69,6 +69,20 @@ typedef struct _GstVaapiVideoBufferPoolPrivate GstVaapiVideoBufferPoolPrivate; "GstBufferPoolOptionVideoGLTextureUploadMeta" #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: * diff --git a/gst/vaapi/gstvaapivideomemory.c b/gst/vaapi/gstvaapivideomemory.c index fa368bdaf6..528e217126 100644 --- a/gst/vaapi/gstvaapivideomemory.c +++ b/gst/vaapi/gstvaapivideomemory.c @@ -281,7 +281,7 @@ gst_vaapi_video_memory_new (GstAllocator * base_allocator, mem->surface = NULL; mem->image_info = &allocator->image_info; 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_count = 0; mem->use_direct_rendering = allocator->has_direct_rendering; @@ -294,7 +294,7 @@ gst_vaapi_video_memory_free (GstVaapiVideoMemory * mem) mem->surface = NULL; gst_vaapi_video_memory_reset_image (mem); 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); g_slice_free (GstVaapiVideoMemory, mem); } @@ -319,7 +319,8 @@ gst_vaapi_video_memory_reset_surface (GstVaapiVideoMemory * mem) mem->surface = NULL; gst_vaapi_video_memory_reset_image (mem); gst_vaapi_surface_proxy_replace (&mem->proxy, NULL); - gst_vaapi_video_meta_set_surface_proxy (mem->meta, NULL); + if (mem->meta) + gst_vaapi_video_meta_set_surface_proxy (mem->meta, NULL); } static gpointer @@ -328,6 +329,9 @@ gst_vaapi_video_memory_map (GstVaapiVideoMemory * mem, gsize maxsize, { gpointer data; + g_return_val_if_fail (mem, NULL); + g_return_val_if_fail (mem->meta, NULL); + if (mem->map_count == 0) { switch (flags & GST_MAP_READWRITE) { case 0: @@ -426,6 +430,9 @@ gst_vaapi_video_memory_copy (GstVaapiVideoMemory * mem, GstMemory *out_mem; 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 are not copied */ (void) gst_memory_get_sizes (GST_MEMORY_CAST (mem), NULL, &maxsize);