mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
surface: add support for dma_buf exports.
Use the new VA buffer export APIs to allow for a VA surface to be exposed as a plain PRIME fd. This is in view to simplifying interop with EGL or OpenCL for instance. https://bugzilla.gnome.org/show_bug.cgi?id=735364
This commit is contained in:
parent
250260cc36
commit
073d6d59e1
5 changed files with 133 additions and 0 deletions
|
@ -69,6 +69,7 @@ libgstvaapi_source_c = \
|
||||||
gstvaapiprofile.c \
|
gstvaapiprofile.c \
|
||||||
gstvaapisubpicture.c \
|
gstvaapisubpicture.c \
|
||||||
gstvaapisurface.c \
|
gstvaapisurface.c \
|
||||||
|
gstvaapisurface_drm.c \
|
||||||
gstvaapisurfacepool.c \
|
gstvaapisurfacepool.c \
|
||||||
gstvaapisurfaceproxy.c \
|
gstvaapisurfaceproxy.c \
|
||||||
gstvaapitexture.c \
|
gstvaapitexture.c \
|
||||||
|
@ -98,6 +99,7 @@ libgstvaapi_source_h = \
|
||||||
gstvaapiprofile.h \
|
gstvaapiprofile.h \
|
||||||
gstvaapisubpicture.h \
|
gstvaapisubpicture.h \
|
||||||
gstvaapisurface.h \
|
gstvaapisurface.h \
|
||||||
|
gstvaapisurface_drm.h \
|
||||||
gstvaapisurfacepool.h \
|
gstvaapisurfacepool.h \
|
||||||
gstvaapisurfaceproxy.h \
|
gstvaapisurfaceproxy.h \
|
||||||
gstvaapitexture.h \
|
gstvaapitexture.h \
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sysdeps.h"
|
#include "sysdeps.h"
|
||||||
|
#include <va/va_drmcommon.h>
|
||||||
|
#include "gstvaapicompat.h"
|
||||||
#include "gstvaapibufferproxy.h"
|
#include "gstvaapibufferproxy.h"
|
||||||
#include "gstvaapibufferproxy_priv.h"
|
#include "gstvaapibufferproxy_priv.h"
|
||||||
#include "gstvaapiutils.h"
|
#include "gstvaapiutils.h"
|
||||||
|
@ -40,6 +42,9 @@ from_GstVaapiBufferMemoryType (guint type)
|
||||||
guint va_type;
|
guint va_type;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
case GST_VAAPI_BUFFER_MEMORY_TYPE_DMA_BUF:
|
||||||
|
va_type = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
va_type = 0;
|
va_type = 0;
|
||||||
break;
|
break;
|
||||||
|
@ -53,6 +58,9 @@ to_GstVaapiBufferMemoryType (guint va_type)
|
||||||
guint type;
|
guint type;
|
||||||
|
|
||||||
switch (va_type) {
|
switch (va_type) {
|
||||||
|
case VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME:
|
||||||
|
type = GST_VAAPI_BUFFER_MEMORY_TYPE_DMA_BUF;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
type = 0;
|
type = 0;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -57,6 +57,16 @@ G_BEGIN_DECLS
|
||||||
|
|
||||||
typedef struct _GstVaapiBufferProxy GstVaapiBufferProxy;
|
typedef struct _GstVaapiBufferProxy GstVaapiBufferProxy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstVaapiBufferMemoryType:
|
||||||
|
* @GST_VAAPI_BUFFER_MEMORY_TYPE_DMA_BUF: DRM PRIME buffer memory type.
|
||||||
|
*
|
||||||
|
* Set of underlying VA buffer memory types.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
GST_VAAPI_BUFFER_MEMORY_TYPE_DMA_BUF = 1,
|
||||||
|
} GstVaapiBufferMemoryType;
|
||||||
|
|
||||||
GstVaapiBufferProxy *
|
GstVaapiBufferProxy *
|
||||||
gst_vaapi_buffer_proxy_new (guintptr handle, guint type, gsize size,
|
gst_vaapi_buffer_proxy_new (guintptr handle, guint type, gsize size,
|
||||||
GDestroyNotify destroy_func, gpointer user_data);
|
GDestroyNotify destroy_func, gpointer user_data);
|
||||||
|
|
77
gst-libs/gst/vaapi/gstvaapisurface_drm.c
Normal file
77
gst-libs/gst/vaapi/gstvaapisurface_drm.c
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
* gstvaapisurface_drm.c - VA surface abstraction (DRM interop)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Intel Corporation
|
||||||
|
* Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free
|
||||||
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "sysdeps.h"
|
||||||
|
#include "gstvaapisurface_drm.h"
|
||||||
|
#include "gstvaapisurface_priv.h"
|
||||||
|
#include "gstvaapiimage_priv.h"
|
||||||
|
#include "gstvaapibufferproxy_priv.h"
|
||||||
|
|
||||||
|
static GstVaapiBufferProxy *
|
||||||
|
gst_vaapi_surface_get_drm_buf_handle (GstVaapiSurface * surface, guint type)
|
||||||
|
{
|
||||||
|
GstVaapiBufferProxy *proxy;
|
||||||
|
GstVaapiImage *image;
|
||||||
|
|
||||||
|
image = gst_vaapi_surface_derive_image (surface);
|
||||||
|
if (!image)
|
||||||
|
goto error_derive_image;
|
||||||
|
|
||||||
|
proxy =
|
||||||
|
gst_vaapi_buffer_proxy_new_from_object (GST_VAAPI_OBJECT (surface),
|
||||||
|
image->internal_image.buf, type, gst_vaapi_object_unref, image);
|
||||||
|
if (!proxy)
|
||||||
|
goto error_alloc_export_buffer;
|
||||||
|
return proxy;
|
||||||
|
|
||||||
|
/* ERRORS */
|
||||||
|
error_derive_image:
|
||||||
|
GST_ERROR ("failed to extract image handle from surface");
|
||||||
|
return NULL;
|
||||||
|
error_alloc_export_buffer:
|
||||||
|
GST_ERROR ("failed to allocate export buffer proxy");
|
||||||
|
gst_vaapi_object_unref (image);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vaapi_surface_get_dma_buf_handle:
|
||||||
|
* @surface: a #GstVaapiSurface
|
||||||
|
*
|
||||||
|
* If the underlying VA driver implementation supports it, this
|
||||||
|
* function allows for returning a suitable dma_buf (DRM) buffer
|
||||||
|
* handle as a #GstVaapiBufferProxy instance. The resulting buffer
|
||||||
|
* handle is live until the last reference to the proxy gets
|
||||||
|
* released. Besides, any further change to the parent VA @surface may
|
||||||
|
* fail.
|
||||||
|
*
|
||||||
|
* Return value: the underlying buffer as a #GstVaapiBufferProxy
|
||||||
|
* instance.
|
||||||
|
*/
|
||||||
|
GstVaapiBufferProxy *
|
||||||
|
gst_vaapi_surface_get_dma_buf_handle (GstVaapiSurface * surface)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (surface != NULL, NULL);
|
||||||
|
|
||||||
|
return gst_vaapi_surface_get_drm_buf_handle (surface,
|
||||||
|
GST_VAAPI_BUFFER_MEMORY_TYPE_DMA_BUF);
|
||||||
|
}
|
36
gst-libs/gst/vaapi/gstvaapisurface_drm.h
Normal file
36
gst-libs/gst/vaapi/gstvaapisurface_drm.h
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* gstvaapisurface_drm.h - VA surface abstraction (DRM interop)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Intel Corporation
|
||||||
|
* Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free
|
||||||
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GST_VAAPI_SURFACE_DRM_H
|
||||||
|
#define GST_VAAPI_SURFACE_DRM_H
|
||||||
|
|
||||||
|
#include <gst/vaapi/gstvaapisurface.h>
|
||||||
|
#include <gst/vaapi/gstvaapibufferproxy.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
GstVaapiBufferProxy *
|
||||||
|
gst_vaapi_surface_get_dma_buf_handle (GstVaapiSurface * surface);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* GST_VAAPI_SURFACE_DRM_H */
|
Loading…
Reference in a new issue