diff --git a/gst-libs/gst/vaapi/gstvaapibufferproxy.c b/gst-libs/gst/vaapi/gstvaapibufferproxy.c index 75cbe9296d..44c6126135 100644 --- a/gst-libs/gst/vaapi/gstvaapibufferproxy.c +++ b/gst-libs/gst/vaapi/gstvaapibufferproxy.c @@ -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; +} diff --git a/gst-libs/gst/vaapi/gstvaapibufferproxy.h b/gst-libs/gst/vaapi/gstvaapibufferproxy.h index 7d611cf3f8..872af2f7c6 100644 --- a/gst-libs/gst/vaapi/gstvaapibufferproxy.h +++ b/gst-libs/gst/vaapi/gstvaapibufferproxy.h @@ -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 */ diff --git a/gst-libs/gst/vaapi/gstvaapibufferproxy_priv.h b/gst-libs/gst/vaapi/gstvaapibufferproxy_priv.h index 833e22ce22..2cbbbf9cf8 100644 --- a/gst-libs/gst/vaapi/gstvaapibufferproxy_priv.h +++ b/gst-libs/gst/vaapi/gstvaapibufferproxy_priv.h @@ -71,6 +71,7 @@ struct _GstVaapiBufferProxy { #if VA_CHECK_VERSION (0,36,0) VABufferInfo va_info; #endif + GstMemory *mem; }; G_GNUC_INTERNAL