libs: bufferproxy: gst_vaapi_buffer_proxy_{set,peek}_mem()

This patch adds a GstMemory as a variable member of the buffer proxy,
because we will need to associate the buffer proxy with the memory
which exposes it. Later, we will know which memory, in the video buffer
pool, is attached to the processed surface.

https://bugzilla.gnome.org/show_bug.cgi?id=755072
This commit is contained in:
Julien Isorce 2016-10-19 15:07:31 +01:00 committed by Víctor Manuel Jáquez Leal
parent bc97987ffb
commit 7fc1b70ff6
3 changed files with 47 additions and 0 deletions

View file

@ -128,6 +128,11 @@ gst_vaapi_buffer_proxy_finalize (GstVaapiBufferProxy * proxy)
{
gst_vaapi_buffer_proxy_release_handle (proxy);
if (proxy->mem) {
gst_memory_unref (proxy->mem);
proxy->mem = NULL;
}
/* Notify the user function that the object is now destroyed */
if (proxy->destroy_func)
proxy->destroy_func (proxy->destroy_data);
@ -171,6 +176,7 @@ gst_vaapi_buffer_proxy_new (guintptr handle, guint type, gsize size,
proxy->va_info.type = VAImageBufferType;
proxy->va_info.mem_type = from_GstVaapiBufferMemoryType (proxy->type);
proxy->va_info.mem_size = size;
proxy->mem = NULL;
if (!proxy->va_info.mem_type)
goto error_unsupported_mem_type;
return proxy;
@ -206,6 +212,7 @@ gst_vaapi_buffer_proxy_new_from_object (GstVaapiObject * object,
proxy->destroy_data = data;
proxy->type = type;
proxy->va_buf = buf_id;
proxy->mem = NULL;
memset (&proxy->va_info, 0, sizeof (proxy->va_info));
proxy->va_info.mem_type = from_GstVaapiBufferMemoryType (proxy->type);
if (!proxy->va_info.mem_type)
@ -355,3 +362,36 @@ gst_vaapi_buffer_proxy_release_data (GstVaapiBufferProxy * proxy)
proxy->destroy_data = NULL;
}
}
/**
* gst_vaapi_buffer_proxy_set_mem:
* @proxy: a #GstVaapiBufferProxy
* @mem: a #GstMemory
*
* Relates @mem with @proxy, hence we later will know which memory
* correspond to processed surface.
*
* This is useful when a dmabuf-based memory is instantiated and
* associated with a surface.
**/
void
gst_vaapi_buffer_proxy_set_mem (GstVaapiBufferProxy * proxy, GstMemory * mem)
{
gst_mini_object_replace ((GstMiniObject **) & proxy->mem,
GST_MINI_OBJECT (mem));
}
/**
* gst_vaapi_buffer_proxy_peek_mem:
* @proxy: a #GstVaapiBufferProxy
*
* This is useful when a dmabuf-based memory is instantiated and
* associated with a surface.
*
* Returns: (transfer none): the assigned #GstMemory to the @proxy.
**/
GstMemory *
gst_vaapi_buffer_proxy_peek_mem (GstVaapiBufferProxy * proxy)
{
return proxy->mem;
}

View file

@ -95,6 +95,12 @@ gst_vaapi_buffer_proxy_get_size (GstVaapiBufferProxy * proxy);
void
gst_vaapi_buffer_proxy_release_data (GstVaapiBufferProxy * proxy);
void
gst_vaapi_buffer_proxy_set_mem (GstVaapiBufferProxy * proxy, GstMemory * mem);
GstMemory *
gst_vaapi_buffer_proxy_peek_mem (GstVaapiBufferProxy * proxy);
G_END_DECLS
#endif /* GST_VAAPI_BUFFER_PROXY_H */

View file

@ -71,6 +71,7 @@ struct _GstVaapiBufferProxy {
#if VA_CHECK_VERSION (0,36,0)
VABufferInfo va_info;
#endif
GstMemory *mem;
};
G_GNUC_INTERNAL