plugins: re-indent all GstVaapiVideo* related source code.

This commit is contained in:
Gwenole Beauchesne 2014-08-21 10:45:31 +02:00
parent 97d7f21575
commit 038d56bdca
16 changed files with 1561 additions and 1572 deletions

View file

@ -38,174 +38,171 @@
#if GST_CHECK_VERSION(1,1,0) #if GST_CHECK_VERSION(1,1,0)
static inline GstBuffer * static inline GstBuffer *
gst_surface_buffer_new(void) gst_surface_buffer_new (void)
{ {
return gst_buffer_new(); return gst_buffer_new ();
} }
#elif GST_CHECK_VERSION(1,0,0) #elif GST_CHECK_VERSION(1,0,0)
#include <gst/video/gstsurfacemeta.h> #include <gst/video/gstsurfacemeta.h>
#define GST_VAAPI_SURFACE_META_CAST(obj) \ #define GST_VAAPI_SURFACE_META_CAST(obj) \
((GstVaapiSurfaceMeta *)(obj)) ((GstVaapiSurfaceMeta *) (obj))
typedef struct _GstVaapiSurfaceMeta GstVaapiSurfaceMeta; typedef struct _GstVaapiSurfaceMeta GstVaapiSurfaceMeta;
struct _GstVaapiSurfaceMeta { struct _GstVaapiSurfaceMeta
GstSurfaceMeta base; {
GstBuffer *buffer; GstSurfaceMeta base;
GstBuffer *buffer;
}; };
#define GST_VAAPI_SURFACE_META_INFO gst_vaapi_surface_meta_get_info() #define GST_VAAPI_SURFACE_META_INFO \
static const GstMetaInfo * gst_vaapi_surface_meta_get_info ()
gst_vaapi_surface_meta_get_info(void);
typedef GstSurfaceConverter *(*GstSurfaceConverterCreateFunc)( static const GstMetaInfo *
GstSurfaceMeta *meta, const gchar *type, GValue *dest); gst_vaapi_surface_meta_get_info (void);
typedef GstSurfaceConverter *(*GstSurfaceConverterCreateFunc) (GstSurfaceMeta *
meta, const gchar * type, GValue * dest);
#if USE_X11 #if USE_X11
static GstSurfaceConverter * static GstSurfaceConverter *
gst_vaapi_surface_create_converter_x11(GstSurfaceMeta *base_meta, gst_vaapi_surface_create_converter_x11 (GstSurfaceMeta * base_meta,
const gchar *type, GValue *dest) const gchar * type, GValue * dest)
{ {
GstVaapiSurfaceMeta * const meta = GST_VAAPI_SURFACE_META_CAST(base_meta); GstVaapiSurfaceMeta *const meta = GST_VAAPI_SURFACE_META_CAST (base_meta);
return gst_vaapi_video_converter_x11_new(meta->buffer, type, dest); return gst_vaapi_video_converter_x11_new (meta->buffer, type, dest);
} }
#undef gst_vaapi_video_converter_x11_new #undef gst_vaapi_video_converter_x11_new
#define gst_vaapi_video_converter_x11_new \ #define gst_vaapi_video_converter_x11_new \
gst_vaapi_surface_create_converter_x11 gst_vaapi_surface_create_converter_x11
#endif #endif
#if USE_GLX #if USE_GLX
static GstSurfaceConverter * static GstSurfaceConverter *
gst_vaapi_surface_create_converter_glx(GstSurfaceMeta *base_meta, gst_vaapi_surface_create_converter_glx (GstSurfaceMeta * base_meta,
const gchar *type, GValue *dest) const gchar * type, GValue * dest)
{ {
GstVaapiSurfaceMeta * const meta = GST_VAAPI_SURFACE_META_CAST(base_meta); GstVaapiSurfaceMeta *const meta = GST_VAAPI_SURFACE_META_CAST (base_meta);
return gst_vaapi_video_converter_glx_new(meta->buffer, type, dest); return gst_vaapi_video_converter_glx_new (meta->buffer, type, dest);
} }
#undef gst_vaapi_video_converter_glx_new #undef gst_vaapi_video_converter_glx_new
#define gst_vaapi_video_converter_glx_new \ #define gst_vaapi_video_converter_glx_new \
gst_vaapi_surface_create_converter_glx gst_vaapi_surface_create_converter_glx
#endif #endif
static GstSurfaceConverter * static GstSurfaceConverter *
gst_vaapi_surface_create_converter(GstSurfaceMeta *base_meta, gst_vaapi_surface_create_converter (GstSurfaceMeta * base_meta,
const gchar *type, GValue *dest) const gchar * type, GValue * dest)
{ {
GstVaapiSurfaceMeta * const meta = GST_VAAPI_SURFACE_META_CAST(base_meta); GstVaapiSurfaceMeta *const meta = GST_VAAPI_SURFACE_META_CAST (base_meta);
GstVaapiVideoMeta * const vmeta = GstVaapiVideoMeta *const vmeta =
gst_buffer_get_vaapi_video_meta(meta->buffer); gst_buffer_get_vaapi_video_meta (meta->buffer);
GstSurfaceConverterCreateFunc func; GstSurfaceConverterCreateFunc func;
if (G_UNLIKELY(!vmeta)) if (G_UNLIKELY (!vmeta))
return NULL; return NULL;
func = (GstSurfaceConverterCreateFunc) func = (GstSurfaceConverterCreateFunc)
gst_vaapi_video_meta_get_surface_converter(vmeta); gst_vaapi_video_meta_get_surface_converter (vmeta);
return func ? func(base_meta, type, dest) : NULL; return func ? func (base_meta, type, dest) : NULL;
} }
static gboolean static gboolean
gst_vaapi_surface_meta_init(GstVaapiSurfaceMeta *meta, gpointer params, gst_vaapi_surface_meta_init (GstVaapiSurfaceMeta * meta, gpointer params,
GstBuffer *buffer) GstBuffer * buffer)
{ {
meta->base.create_converter = gst_vaapi_surface_create_converter; meta->base.create_converter = gst_vaapi_surface_create_converter;
meta->buffer = buffer; meta->buffer = buffer;
return TRUE; return TRUE;
} }
static void static void
gst_vaapi_surface_meta_free(GstVaapiSurfaceMeta *meta, GstBuffer *buffer) gst_vaapi_surface_meta_free (GstVaapiSurfaceMeta * meta, GstBuffer * buffer)
{ {
} }
static gboolean static gboolean
gst_vaapi_surface_meta_transform(GstBuffer *dst_buffer, GstMeta *meta, gst_vaapi_surface_meta_transform (GstBuffer * dst_buffer, GstMeta * meta,
GstBuffer *src_buffer, GQuark type, gpointer data) GstBuffer * src_buffer, GQuark type, gpointer data)
{ {
GstVaapiVideoMeta * const src_vmeta = GstVaapiVideoMeta *const src_vmeta =
gst_buffer_get_vaapi_video_meta(src_buffer); gst_buffer_get_vaapi_video_meta (src_buffer);
if (GST_META_TRANSFORM_IS_COPY(type)) { if (GST_META_TRANSFORM_IS_COPY (type)) {
GstVaapiSurfaceMeta * const dst_smeta = GST_VAAPI_SURFACE_META_CAST( GstVaapiSurfaceMeta *const dst_smeta =
gst_buffer_add_meta(dst_buffer, GST_VAAPI_SURFACE_META_INFO, NULL)); GST_VAAPI_SURFACE_META_CAST (gst_buffer_add_meta (dst_buffer,
GST_VAAPI_SURFACE_META_INFO, NULL));
/* Note: avoid meta lookups in gst_vaapi_surface_create_converter() /* Note: avoid meta lookups in gst_vaapi_surface_create_converter()
by directly calling the GstVaapiVideoMeta::surface_converter hook */ by directly calling the GstVaapiVideoMeta::surface_converter hook */
dst_smeta->base.create_converter = (GstSurfaceConverterCreateFunc) dst_smeta->base.create_converter = (GstSurfaceConverterCreateFunc)
gst_vaapi_video_meta_get_surface_converter(src_vmeta); gst_vaapi_video_meta_get_surface_converter (src_vmeta);
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
const GstMetaInfo * const GstMetaInfo *
gst_vaapi_surface_meta_get_info(void) gst_vaapi_surface_meta_get_info (void)
{ {
static gsize g_meta_info; static gsize g_meta_info;
if (g_once_init_enter(&g_meta_info)) { if (g_once_init_enter (&g_meta_info)) {
gsize meta_info = GPOINTER_TO_SIZE(gst_meta_register( gsize meta_info =
GST_SURFACE_META_API_TYPE, GPOINTER_TO_SIZE (gst_meta_register (GST_SURFACE_META_API_TYPE,
"GstVaapiSurfaceMeta", sizeof(GstVaapiSurfaceMeta), "GstVaapiSurfaceMeta", sizeof (GstVaapiSurfaceMeta),
(GstMetaInitFunction)gst_vaapi_surface_meta_init, (GstMetaInitFunction) gst_vaapi_surface_meta_init,
(GstMetaFreeFunction)gst_vaapi_surface_meta_free, (GstMetaFreeFunction) gst_vaapi_surface_meta_free,
(GstMetaTransformFunction)gst_vaapi_surface_meta_transform)); (GstMetaTransformFunction) gst_vaapi_surface_meta_transform));
g_once_init_leave(&g_meta_info, meta_info); g_once_init_leave (&g_meta_info, meta_info);
} }
return GSIZE_TO_POINTER(g_meta_info); return GSIZE_TO_POINTER (g_meta_info);
} }
static GstBuffer * static GstBuffer *
gst_surface_buffer_new(void) gst_surface_buffer_new (void)
{ {
GstBuffer * const buffer = gst_buffer_new(); GstBuffer *const buffer = gst_buffer_new ();
if (buffer) if (buffer)
gst_buffer_add_meta(buffer, GST_VAAPI_SURFACE_META_INFO, NULL); gst_buffer_add_meta (buffer, GST_VAAPI_SURFACE_META_INFO, NULL);
return buffer; return buffer;
} }
#else #else
#include <gst/video/gstsurfacebuffer.h> #include <gst/video/gstsurfacebuffer.h>
#define GST_VAAPI_TYPE_VIDEO_BUFFER \ #define GST_VAAPI_TYPE_VIDEO_BUFFER \
(gst_vaapi_video_buffer_get_type()) (gst_vaapi_video_buffer_get_type ())
#define GST_VAAPI_VIDEO_BUFFER(obj) \
#define GST_VAAPI_VIDEO_BUFFER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_VAAPI_TYPE_VIDEO_BUFFER, \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \ GstVaapiVideoBuffer))
GST_VAAPI_TYPE_VIDEO_BUFFER, \ #define GST_VAAPI_VIDEO_BUFFER_CLASS(klass) \
GstVaapiVideoBuffer)) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_VAAPI_TYPE_VIDEO_BUFFER, \
GstVaapiVideoBufferClass))
#define GST_VAAPI_VIDEO_BUFFER_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
GST_VAAPI_TYPE_VIDEO_BUFFER, \
GstVaapiVideoBufferClass))
#define GST_VAAPI_IS_VIDEO_BUFFER(obj) \ #define GST_VAAPI_IS_VIDEO_BUFFER(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_VIDEO_BUFFER)) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_VAAPI_TYPE_VIDEO_BUFFER))
#define GST_VAAPI_IS_VIDEO_BUFFER_CLASS(klass) \ #define GST_VAAPI_IS_VIDEO_BUFFER_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_VIDEO_BUFFER)) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_VAAPI_TYPE_VIDEO_BUFFER))
#define GST_VAAPI_VIDEO_BUFFER_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_VAAPI_TYPE_VIDEO_BUFFER, \
GstVaapiVideoBufferClass))
#define GST_VAAPI_VIDEO_BUFFER_GET_CLASS(obj) \ typedef struct _GstVaapiVideoBufferClass GstVaapiVideoBufferClass;
(G_TYPE_INSTANCE_GET_CLASS((obj), \
GST_VAAPI_TYPE_VIDEO_BUFFER, \
GstVaapiVideoBufferClass))
typedef struct _GstVaapiVideoBufferClass GstVaapiVideoBufferClass;
/** /**
* GstVaapiVideoBuffer: * GstVaapiVideoBuffer:
* *
* A #GstBuffer holding video objects (#GstVaapiSurface and #GstVaapiImage). * A #GstBuffer holding video objects (#GstVaapiSurface and #GstVaapiImage).
*/ */
struct _GstVaapiVideoBuffer { struct _GstVaapiVideoBuffer
/*< private >*/ {
GstSurfaceBuffer parent_instance; /*< private >*/
GstSurfaceBuffer parent_instance;
}; };
/** /**
@ -213,134 +210,134 @@ struct _GstVaapiVideoBuffer {
* *
* A #GstBuffer holding video objects * A #GstBuffer holding video objects
*/ */
struct _GstVaapiVideoBufferClass { struct _GstVaapiVideoBufferClass
/*< private >*/ {
GstSurfaceBufferClass parent_class; /*< private >*/
GstSurfaceBufferClass parent_class;
}; };
GType GType
gst_vaapi_video_buffer_get_type(void) G_GNUC_CONST; gst_vaapi_video_buffer_get_type (void) G_GNUC_CONST;
G_DEFINE_TYPE(GstVaapiVideoBuffer, G_DEFINE_TYPE (GstVaapiVideoBuffer,
gst_vaapi_video_buffer, gst_vaapi_video_buffer, GST_TYPE_SURFACE_BUFFER);
GST_TYPE_SURFACE_BUFFER)
typedef GstSurfaceConverter *(*GstSurfaceConverterCreateFunc)( typedef GstSurfaceConverter *
GstSurfaceBuffer *surface, const gchar *type, GValue *dest); (*GstSurfaceConverterCreateFunc) (GstSurfaceBuffer * surface,
const gchar * type, GValue * dest);
static GstSurfaceConverter * static GstSurfaceConverter *
gst_vaapi_video_buffer_create_converter(GstSurfaceBuffer *surface, gst_vaapi_video_buffer_create_converter (GstSurfaceBuffer * surface,
const gchar *type, GValue *dest) const gchar * type, GValue * dest)
{ {
GstVaapiVideoMeta * const meta = GstVaapiVideoMeta *const meta =
gst_buffer_get_vaapi_video_meta(GST_BUFFER(surface)); gst_buffer_get_vaapi_video_meta (GST_BUFFER (surface));
GstSurfaceConverterCreateFunc func; GstSurfaceConverterCreateFunc func;
g_return_val_if_fail(meta != NULL, NULL); g_return_val_if_fail (meta != NULL, NULL);
func = (GstSurfaceConverterCreateFunc) func = (GstSurfaceConverterCreateFunc)
gst_vaapi_video_meta_get_surface_converter(meta); gst_vaapi_video_meta_get_surface_converter (meta);
return func ? func(surface, type, dest) : NULL; return func ? func (surface, type, dest) : NULL;
} }
static void static void
gst_vaapi_video_buffer_class_init(GstVaapiVideoBufferClass *klass) gst_vaapi_video_buffer_class_init (GstVaapiVideoBufferClass * klass)
{ {
GstSurfaceBufferClass * const surface_class = GstSurfaceBufferClass *const surface_class = GST_SURFACE_BUFFER_CLASS (klass);
GST_SURFACE_BUFFER_CLASS(klass);
surface_class->create_converter = gst_vaapi_video_buffer_create_converter; surface_class->create_converter = gst_vaapi_video_buffer_create_converter;
} }
static void static void
gst_vaapi_video_buffer_init(GstVaapiVideoBuffer *buffer) gst_vaapi_video_buffer_init (GstVaapiVideoBuffer * buffer)
{ {
} }
static inline GstBuffer * static inline GstBuffer *
gst_surface_buffer_new(void) gst_surface_buffer_new (void)
{ {
return GST_BUFFER_CAST(gst_mini_object_new(GST_VAAPI_TYPE_VIDEO_BUFFER)); return GST_BUFFER_CAST (gst_mini_object_new (GST_VAAPI_TYPE_VIDEO_BUFFER));
} }
#endif #endif
static GFunc static GFunc
get_surface_converter(GstVaapiDisplay *display) get_surface_converter (GstVaapiDisplay * display)
{ {
GFunc func; GFunc func;
switch (gst_vaapi_display_get_display_type(display)) { switch (gst_vaapi_display_get_display_type (display)) {
#if USE_X11 && !GST_CHECK_VERSION(1,1,0) #if USE_X11 && !GST_CHECK_VERSION(1,1,0)
case GST_VAAPI_DISPLAY_TYPE_X11: case GST_VAAPI_DISPLAY_TYPE_X11:
func = (GFunc)gst_vaapi_video_converter_x11_new; func = (GFunc) gst_vaapi_video_converter_x11_new;
break; break;
#endif #endif
#if USE_GLX && !GST_CHECK_VERSION(1,1,0) #if USE_GLX && !GST_CHECK_VERSION(1,1,0)
case GST_VAAPI_DISPLAY_TYPE_GLX: case GST_VAAPI_DISPLAY_TYPE_GLX:
func = (GFunc)gst_vaapi_video_converter_glx_new; func = (GFunc) gst_vaapi_video_converter_glx_new;
break; break;
#endif #endif
default: default:
func = NULL; func = NULL;
break; break;
} }
return func; return func;
} }
static GstBuffer * static GstBuffer *
new_vbuffer(GstVaapiVideoMeta *meta) new_vbuffer (GstVaapiVideoMeta * meta)
{ {
GstBuffer *buffer; GstBuffer *buffer;
g_return_val_if_fail(meta != NULL, NULL); g_return_val_if_fail (meta != NULL, NULL);
gst_vaapi_video_meta_set_surface_converter(meta, gst_vaapi_video_meta_set_surface_converter (meta,
get_surface_converter(gst_vaapi_video_meta_get_display(meta))); get_surface_converter (gst_vaapi_video_meta_get_display (meta)));
buffer = gst_surface_buffer_new(); buffer = gst_surface_buffer_new ();
if (buffer) if (buffer)
gst_buffer_set_vaapi_video_meta(buffer, meta); gst_buffer_set_vaapi_video_meta (buffer, meta);
gst_vaapi_video_meta_unref(meta); gst_vaapi_video_meta_unref (meta);
return buffer; return buffer;
} }
GstBuffer * GstBuffer *
gst_vaapi_video_buffer_new(GstVaapiVideoMeta *meta) gst_vaapi_video_buffer_new (GstVaapiVideoMeta * meta)
{ {
g_return_val_if_fail(meta != NULL, NULL); g_return_val_if_fail (meta != NULL, NULL);
return new_vbuffer(gst_vaapi_video_meta_ref(meta)); return new_vbuffer (gst_vaapi_video_meta_ref (meta));
} }
GstBuffer * GstBuffer *
gst_vaapi_video_buffer_new_empty(void) gst_vaapi_video_buffer_new_empty (void)
{ {
return gst_surface_buffer_new(); return gst_surface_buffer_new ();
} }
GstBuffer * GstBuffer *
gst_vaapi_video_buffer_new_from_pool(GstVaapiVideoPool *pool) gst_vaapi_video_buffer_new_from_pool (GstVaapiVideoPool * pool)
{ {
return new_vbuffer(gst_vaapi_video_meta_new_from_pool(pool)); return new_vbuffer (gst_vaapi_video_meta_new_from_pool (pool));
} }
GstBuffer * GstBuffer *
gst_vaapi_video_buffer_new_from_buffer(GstBuffer *buffer) gst_vaapi_video_buffer_new_from_buffer (GstBuffer * buffer)
{ {
GstVaapiVideoMeta * const meta = gst_buffer_get_vaapi_video_meta(buffer); GstVaapiVideoMeta *const meta = gst_buffer_get_vaapi_video_meta (buffer);
return meta ? new_vbuffer(gst_vaapi_video_meta_ref(meta)) : NULL; return meta ? new_vbuffer (gst_vaapi_video_meta_ref (meta)) : NULL;
} }
GstBuffer * GstBuffer *
gst_vaapi_video_buffer_new_with_image(GstVaapiImage *image) gst_vaapi_video_buffer_new_with_image (GstVaapiImage * image)
{ {
return new_vbuffer(gst_vaapi_video_meta_new_with_image(image)); return new_vbuffer (gst_vaapi_video_meta_new_with_image (image));
} }
GstBuffer * GstBuffer *
gst_vaapi_video_buffer_new_with_surface_proxy(GstVaapiSurfaceProxy *proxy) gst_vaapi_video_buffer_new_with_surface_proxy (GstVaapiSurfaceProxy * proxy)
{ {
return new_vbuffer(gst_vaapi_video_meta_new_with_surface_proxy(proxy)); return new_vbuffer (gst_vaapi_video_meta_new_with_surface_proxy (proxy));
} }

View file

@ -29,31 +29,31 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _GstVaapiVideoBuffer GstVaapiVideoBuffer; typedef struct _GstVaapiVideoBuffer GstVaapiVideoBuffer;
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstBuffer * GstBuffer *
gst_vaapi_video_buffer_new(GstVaapiVideoMeta *meta); gst_vaapi_video_buffer_new (GstVaapiVideoMeta * meta);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstBuffer * GstBuffer *
gst_vaapi_video_buffer_new_empty(void); gst_vaapi_video_buffer_new_empty (void);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstBuffer * GstBuffer *
gst_vaapi_video_buffer_new_from_pool(GstVaapiVideoPool *pool); gst_vaapi_video_buffer_new_from_pool (GstVaapiVideoPool * pool);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstBuffer * GstBuffer *
gst_vaapi_video_buffer_new_from_buffer(GstBuffer *buffer); gst_vaapi_video_buffer_new_from_buffer (GstBuffer * buffer);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstBuffer * GstBuffer *
gst_vaapi_video_buffer_new_with_image(GstVaapiImage *image); gst_vaapi_video_buffer_new_with_image (GstVaapiImage * image);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstBuffer * GstBuffer *
gst_vaapi_video_buffer_new_with_surface_proxy(GstVaapiSurfaceProxy *proxy); gst_vaapi_video_buffer_new_with_surface_proxy (GstVaapiSurfaceProxy * proxy);
G_END_DECLS G_END_DECLS

View file

@ -28,317 +28,319 @@
#include "gstvaapivideometa_texture.h" #include "gstvaapivideometa_texture.h"
#endif #endif
GST_DEBUG_CATEGORY_STATIC(gst_debug_vaapivideopool); GST_DEBUG_CATEGORY_STATIC (gst_debug_vaapivideopool);
#define GST_CAT_DEFAULT gst_debug_vaapivideopool #define GST_CAT_DEFAULT gst_debug_vaapivideopool
G_DEFINE_TYPE(GstVaapiVideoBufferPool, G_DEFINE_TYPE (GstVaapiVideoBufferPool,
gst_vaapi_video_buffer_pool, gst_vaapi_video_buffer_pool, GST_TYPE_BUFFER_POOL);
GST_TYPE_BUFFER_POOL)
enum { enum
PROP_0, {
PROP_0,
PROP_DISPLAY, PROP_DISPLAY,
}; };
struct _GstVaapiVideoBufferPoolPrivate { struct _GstVaapiVideoBufferPoolPrivate
GstVideoInfo video_info[2]; {
guint video_info_index; GstVideoInfo video_info[2];
GstAllocator *allocator; guint video_info_index;
GstVaapiDisplay *display; GstAllocator *allocator;
guint has_video_meta : 1; GstVaapiDisplay *display;
guint has_video_alignment : 1; guint has_video_meta:1;
guint has_texture_upload_meta : 1; guint has_video_alignment:1;
guint has_texture_upload_meta:1;
}; };
#define GST_VAAPI_VIDEO_BUFFER_POOL_GET_PRIVATE(obj) \ #define GST_VAAPI_VIDEO_BUFFER_POOL_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE((obj), \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_VAAPI_TYPE_VIDEO_BUFFER_POOL, \
GST_VAAPI_TYPE_VIDEO_BUFFER_POOL, \ GstVaapiVideoBufferPoolPrivate))
GstVaapiVideoBufferPoolPrivate))
static void static void
gst_vaapi_video_buffer_pool_finalize(GObject *object) gst_vaapi_video_buffer_pool_finalize (GObject * object)
{ {
GstVaapiVideoBufferPoolPrivate * const priv = GstVaapiVideoBufferPoolPrivate *const priv =
GST_VAAPI_VIDEO_BUFFER_POOL(object)->priv; GST_VAAPI_VIDEO_BUFFER_POOL (object)->priv;
G_OBJECT_CLASS(gst_vaapi_video_buffer_pool_parent_class)->finalize(object); G_OBJECT_CLASS (gst_vaapi_video_buffer_pool_parent_class)->finalize (object);
gst_vaapi_display_replace(&priv->display, NULL); gst_vaapi_display_replace (&priv->display, NULL);
g_clear_object(&priv->allocator); g_clear_object (&priv->allocator);
} }
static void static void
gst_vaapi_video_buffer_pool_set_property(GObject *object, guint prop_id, gst_vaapi_video_buffer_pool_set_property (GObject * object, guint prop_id,
const GValue *value, GParamSpec *pspec) const GValue * value, GParamSpec * pspec)
{ {
GstVaapiVideoBufferPoolPrivate * const priv = GstVaapiVideoBufferPoolPrivate *const priv =
GST_VAAPI_VIDEO_BUFFER_POOL(object)->priv; GST_VAAPI_VIDEO_BUFFER_POOL (object)->priv;
switch (prop_id) { switch (prop_id) {
case PROP_DISPLAY: case PROP_DISPLAY:
priv->display = gst_vaapi_display_ref(g_value_get_pointer(value)); priv->display = gst_vaapi_display_ref (g_value_get_pointer (value));
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
} }
} }
static void static void
gst_vaapi_video_buffer_pool_get_property(GObject *object, guint prop_id, gst_vaapi_video_buffer_pool_get_property (GObject * object, guint prop_id,
GValue *value, GParamSpec *pspec) GValue * value, GParamSpec * pspec)
{ {
GstVaapiVideoBufferPoolPrivate * const priv = GstVaapiVideoBufferPoolPrivate *const priv =
GST_VAAPI_VIDEO_BUFFER_POOL(object)->priv; GST_VAAPI_VIDEO_BUFFER_POOL (object)->priv;
switch (prop_id) { switch (prop_id) {
case PROP_DISPLAY: case PROP_DISPLAY:
g_value_set_pointer(value, priv->display); g_value_set_pointer (value, priv->display);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
} }
} }
static void static void
fill_video_alignment(GstVaapiVideoBufferPool *pool, GstVideoAlignment *align) fill_video_alignment (GstVaapiVideoBufferPool * pool, GstVideoAlignment * align)
{ {
GstVideoInfo * const vip = GstVideoInfo *const vip =
&GST_VAAPI_VIDEO_ALLOCATOR_CAST(pool->priv->allocator)->image_info; &GST_VAAPI_VIDEO_ALLOCATOR_CAST (pool->priv->allocator)->image_info;
guint i; guint i;
gst_video_alignment_reset(align); gst_video_alignment_reset (align);
for (i = 0; i < GST_VIDEO_INFO_N_PLANES(vip); i++) for (i = 0; i < GST_VIDEO_INFO_N_PLANES (vip); i++)
align->stride_align[i] = align->stride_align[i] =
(1U << g_bit_nth_lsf(GST_VIDEO_INFO_PLANE_STRIDE(vip, i), 0)) - 1; (1U << g_bit_nth_lsf (GST_VIDEO_INFO_PLANE_STRIDE (vip, i), 0)) - 1;
} }
static const gchar ** static const gchar **
gst_vaapi_video_buffer_pool_get_options(GstBufferPool *pool) gst_vaapi_video_buffer_pool_get_options (GstBufferPool * pool)
{ {
static const gchar *g_options[] = { static const gchar *g_options[] = {
GST_BUFFER_POOL_OPTION_VIDEO_META, GST_BUFFER_POOL_OPTION_VIDEO_META,
GST_BUFFER_POOL_OPTION_VAAPI_VIDEO_META, GST_BUFFER_POOL_OPTION_VAAPI_VIDEO_META,
GST_BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META, GST_BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META,
GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT, GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT,
NULL, NULL,
}; };
return g_options;
return g_options;
} }
static gboolean static gboolean
gst_vaapi_video_buffer_pool_set_config(GstBufferPool *pool, gst_vaapi_video_buffer_pool_set_config (GstBufferPool * pool,
GstStructure *config) GstStructure * config)
{ {
GstVaapiVideoBufferPoolPrivate * const priv = GstVaapiVideoBufferPoolPrivate *const priv =
GST_VAAPI_VIDEO_BUFFER_POOL(pool)->priv; GST_VAAPI_VIDEO_BUFFER_POOL (pool)->priv;
GstCaps *caps = NULL; GstCaps *caps = NULL;
GstVideoInfo * const cur_vip = &priv->video_info[priv->video_info_index]; GstVideoInfo *const cur_vip = &priv->video_info[priv->video_info_index];
GstVideoInfo * const new_vip = &priv->video_info[!priv->video_info_index]; GstVideoInfo *const new_vip = &priv->video_info[!priv->video_info_index];
GstVideoAlignment align; GstVideoAlignment align;
GstAllocator *allocator; GstAllocator *allocator;
gboolean changed_caps; gboolean changed_caps;
if (!gst_buffer_pool_config_get_params(config, &caps, NULL, NULL, NULL)) if (!gst_buffer_pool_config_get_params (config, &caps, NULL, NULL, NULL))
goto error_invalid_config; goto error_invalid_config;
if (!caps || !gst_video_info_from_caps(new_vip, caps)) if (!caps || !gst_video_info_from_caps (new_vip, caps))
goto error_no_caps; goto error_no_caps;
changed_caps = !priv->allocator || changed_caps = !priv->allocator ||
GST_VIDEO_INFO_FORMAT(cur_vip) != GST_VIDEO_INFO_FORMAT(new_vip) || GST_VIDEO_INFO_FORMAT (cur_vip) != GST_VIDEO_INFO_FORMAT (new_vip) ||
GST_VIDEO_INFO_WIDTH(cur_vip) != GST_VIDEO_INFO_WIDTH(new_vip) || GST_VIDEO_INFO_WIDTH (cur_vip) != GST_VIDEO_INFO_WIDTH (new_vip) ||
GST_VIDEO_INFO_HEIGHT(cur_vip) != GST_VIDEO_INFO_HEIGHT(new_vip); GST_VIDEO_INFO_HEIGHT (cur_vip) != GST_VIDEO_INFO_HEIGHT (new_vip);
if (changed_caps) { if (changed_caps) {
allocator = gst_vaapi_video_allocator_new(priv->display, new_vip); allocator = gst_vaapi_video_allocator_new (priv->display, new_vip);
if (!allocator) if (!allocator)
goto error_create_allocator; goto error_create_allocator;
gst_object_replace((GstObject **)&priv->allocator, gst_object_replace ((GstObject **) & priv->allocator,
GST_OBJECT_CAST(allocator)); GST_OBJECT_CAST (allocator));
gst_object_unref(allocator); gst_object_unref (allocator);
priv->video_info_index ^= 1; priv->video_info_index ^= 1;
} }
if (!gst_buffer_pool_config_has_option(config, if (!gst_buffer_pool_config_has_option (config,
GST_BUFFER_POOL_OPTION_VAAPI_VIDEO_META)) GST_BUFFER_POOL_OPTION_VAAPI_VIDEO_META))
goto error_no_vaapi_video_meta_option; goto error_no_vaapi_video_meta_option;
priv->has_video_meta = gst_buffer_pool_config_has_option(config, priv->has_video_meta = gst_buffer_pool_config_has_option (config,
GST_BUFFER_POOL_OPTION_VIDEO_META); GST_BUFFER_POOL_OPTION_VIDEO_META);
priv->has_video_alignment = gst_buffer_pool_config_has_option(config, priv->has_video_alignment = gst_buffer_pool_config_has_option (config,
GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT);
if (priv->has_video_alignment) { if (priv->has_video_alignment) {
fill_video_alignment(GST_VAAPI_VIDEO_BUFFER_POOL(pool), &align); fill_video_alignment (GST_VAAPI_VIDEO_BUFFER_POOL (pool), &align);
gst_buffer_pool_config_set_video_alignment(config, &align); gst_buffer_pool_config_set_video_alignment (config, &align);
} }
priv->has_texture_upload_meta = gst_buffer_pool_config_has_option(config, priv->has_texture_upload_meta = gst_buffer_pool_config_has_option (config,
GST_BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META); GST_BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META);
return GST_BUFFER_POOL_CLASS(gst_vaapi_video_buffer_pool_parent_class)-> return
set_config(pool, config); GST_BUFFER_POOL_CLASS
(gst_vaapi_video_buffer_pool_parent_class)->set_config (pool, config);
/* ERRORS */ /* ERRORS */
error_invalid_config: error_invalid_config:
{ {
GST_ERROR("invalid config"); GST_ERROR ("invalid config");
return FALSE; return FALSE;
} }
error_no_caps: error_no_caps:
{ {
GST_ERROR("no valid caps in config"); GST_ERROR ("no valid caps in config");
return FALSE; return FALSE;
} }
error_create_allocator: error_create_allocator:
{ {
GST_ERROR("failed to create GstVaapiVideoAllocator object"); GST_ERROR ("failed to create GstVaapiVideoAllocator object");
return FALSE; return FALSE;
} }
error_no_vaapi_video_meta_option: error_no_vaapi_video_meta_option:
{ {
GST_ERROR("no GstVaapiVideoMeta option"); GST_ERROR ("no GstVaapiVideoMeta option");
return FALSE; return FALSE;
} }
} }
static GstFlowReturn static GstFlowReturn
gst_vaapi_video_buffer_pool_alloc_buffer(GstBufferPool *pool, gst_vaapi_video_buffer_pool_alloc_buffer (GstBufferPool * pool,
GstBuffer **out_buffer_ptr, GstBufferPoolAcquireParams *params) GstBuffer ** out_buffer_ptr, GstBufferPoolAcquireParams * params)
{ {
GstVaapiVideoBufferPoolPrivate * const priv = GstVaapiVideoBufferPoolPrivate *const priv =
GST_VAAPI_VIDEO_BUFFER_POOL(pool)->priv; GST_VAAPI_VIDEO_BUFFER_POOL (pool)->priv;
GstVaapiVideoMeta *meta; GstVaapiVideoMeta *meta;
GstMemory *mem; GstMemory *mem;
GstBuffer *buffer; GstBuffer *buffer;
if (!priv->allocator) if (!priv->allocator)
goto error_no_allocator; goto error_no_allocator;
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);
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_unref (meta);
gst_buffer_append_memory(buffer, mem); gst_buffer_append_memory (buffer, mem);
if (priv->has_video_meta) { if (priv->has_video_meta) {
GstVideoInfo * const vip = GstVideoInfo *const vip =
&GST_VAAPI_VIDEO_ALLOCATOR_CAST(priv->allocator)->image_info; &GST_VAAPI_VIDEO_ALLOCATOR_CAST (priv->allocator)->image_info;
GstVideoMeta *vmeta; GstVideoMeta *vmeta;
vmeta = gst_buffer_add_video_meta_full(buffer, 0,
GST_VIDEO_INFO_FORMAT(vip), GST_VIDEO_INFO_WIDTH(vip),
GST_VIDEO_INFO_HEIGHT(vip), GST_VIDEO_INFO_N_PLANES(vip),
&GST_VIDEO_INFO_PLANE_OFFSET(vip, 0),
&GST_VIDEO_INFO_PLANE_STRIDE(vip, 0));
vmeta->map = gst_video_meta_map_vaapi_memory;
vmeta->unmap = gst_video_meta_unmap_vaapi_memory;
}
vmeta = gst_buffer_add_video_meta_full (buffer, 0,
GST_VIDEO_INFO_FORMAT (vip), GST_VIDEO_INFO_WIDTH (vip),
GST_VIDEO_INFO_HEIGHT (vip), GST_VIDEO_INFO_N_PLANES (vip),
&GST_VIDEO_INFO_PLANE_OFFSET (vip, 0),
&GST_VIDEO_INFO_PLANE_STRIDE (vip, 0));
vmeta->map = gst_video_meta_map_vaapi_memory;
vmeta->unmap = gst_video_meta_unmap_vaapi_memory;
}
#if GST_CHECK_VERSION(1,1,0) && USE_GLX #if GST_CHECK_VERSION(1,1,0) && USE_GLX
if (priv->has_texture_upload_meta) if (priv->has_texture_upload_meta)
gst_buffer_add_texture_upload_meta(buffer); gst_buffer_add_texture_upload_meta (buffer);
#endif #endif
*out_buffer_ptr = buffer; *out_buffer_ptr = buffer;
return GST_FLOW_OK; return GST_FLOW_OK;
/* ERRORS */ /* ERRORS */
error_no_allocator: error_no_allocator:
{ {
GST_ERROR("no GstAllocator in buffer pool"); GST_ERROR ("no GstAllocator in buffer pool");
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
} }
error_create_meta: error_create_meta:
{ {
GST_ERROR("failed to allocate vaapi video meta"); GST_ERROR ("failed to allocate vaapi video meta");
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
} }
error_create_buffer: error_create_buffer:
{ {
GST_ERROR("failed to create video buffer"); GST_ERROR ("failed to create video buffer");
gst_vaapi_video_meta_unref(meta); gst_vaapi_video_meta_unref (meta);
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
} }
error_create_memory: error_create_memory:
{ {
GST_ERROR("failed to create video memory"); GST_ERROR ("failed to create video memory");
gst_buffer_unref(buffer); gst_buffer_unref (buffer);
gst_vaapi_video_meta_unref(meta); gst_vaapi_video_meta_unref (meta);
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
} }
} }
static void static void
gst_vaapi_video_buffer_pool_reset_buffer(GstBufferPool *pool, GstBuffer *buffer) gst_vaapi_video_buffer_pool_reset_buffer (GstBufferPool * pool,
GstBuffer * buffer)
{ {
GstMemory * const mem = gst_buffer_peek_memory(buffer, 0); GstMemory *const mem = gst_buffer_peek_memory (buffer, 0);
/* Release the underlying surface proxy */ /* Release the underlying surface proxy */
gst_vaapi_video_memory_reset_surface(GST_VAAPI_VIDEO_MEMORY_CAST(mem)); gst_vaapi_video_memory_reset_surface (GST_VAAPI_VIDEO_MEMORY_CAST (mem));
GST_BUFFER_POOL_CLASS(gst_vaapi_video_buffer_pool_parent_class)-> GST_BUFFER_POOL_CLASS (gst_vaapi_video_buffer_pool_parent_class)->reset_buffer
reset_buffer(pool, buffer); (pool, buffer);
} }
static void static void
gst_vaapi_video_buffer_pool_class_init(GstVaapiVideoBufferPoolClass *klass) gst_vaapi_video_buffer_pool_class_init (GstVaapiVideoBufferPoolClass * klass)
{ {
GObjectClass * const object_class = G_OBJECT_CLASS(klass); GObjectClass *const object_class = G_OBJECT_CLASS (klass);
GstBufferPoolClass * const pool_class = GST_BUFFER_POOL_CLASS(klass); GstBufferPoolClass *const pool_class = GST_BUFFER_POOL_CLASS (klass);
GST_DEBUG_CATEGORY_INIT(gst_debug_vaapivideopool, GST_DEBUG_CATEGORY_INIT (gst_debug_vaapivideopool,
"vaapivideopool", 0, "VA-API video pool"); "vaapivideopool", 0, "VA-API video pool");
g_type_class_add_private(klass, sizeof(GstVaapiVideoBufferPoolPrivate)); g_type_class_add_private (klass, sizeof (GstVaapiVideoBufferPoolPrivate));
object_class->finalize = gst_vaapi_video_buffer_pool_finalize; object_class->finalize = gst_vaapi_video_buffer_pool_finalize;
object_class->set_property = gst_vaapi_video_buffer_pool_set_property; object_class->set_property = gst_vaapi_video_buffer_pool_set_property;
object_class->get_property = gst_vaapi_video_buffer_pool_get_property; object_class->get_property = gst_vaapi_video_buffer_pool_get_property;
pool_class->get_options = gst_vaapi_video_buffer_pool_get_options; pool_class->get_options = gst_vaapi_video_buffer_pool_get_options;
pool_class->set_config = gst_vaapi_video_buffer_pool_set_config; pool_class->set_config = gst_vaapi_video_buffer_pool_set_config;
pool_class->alloc_buffer = gst_vaapi_video_buffer_pool_alloc_buffer; pool_class->alloc_buffer = gst_vaapi_video_buffer_pool_alloc_buffer;
pool_class->reset_buffer = gst_vaapi_video_buffer_pool_reset_buffer; pool_class->reset_buffer = gst_vaapi_video_buffer_pool_reset_buffer;
/** /**
* GstVaapiVideoBufferPool:display: * GstVaapiVideoBufferPool:display:
* *
* The #GstVaapiDisplay this object is bound to. * The #GstVaapiDisplay this object is bound to.
*/ */
g_object_class_install_property g_object_class_install_property
(object_class, (object_class,
PROP_DISPLAY, PROP_DISPLAY,
g_param_spec_pointer("display", g_param_spec_pointer ("display",
"Display", "Display",
"The GstVaapiDisplay to use for this video pool", "The GstVaapiDisplay to use for this video pool",
G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
} }
static void static void
gst_vaapi_video_buffer_pool_init(GstVaapiVideoBufferPool *pool) gst_vaapi_video_buffer_pool_init (GstVaapiVideoBufferPool * pool)
{ {
GstVaapiVideoBufferPoolPrivate * const priv = GstVaapiVideoBufferPoolPrivate *const priv =
GST_VAAPI_VIDEO_BUFFER_POOL_GET_PRIVATE(pool); GST_VAAPI_VIDEO_BUFFER_POOL_GET_PRIVATE (pool);
pool->priv = priv; pool->priv = priv;
gst_video_info_init(&priv->video_info[0]); gst_video_info_init (&priv->video_info[0]);
gst_video_info_init(&priv->video_info[1]); gst_video_info_init (&priv->video_info[1]);
} }
GstBufferPool * GstBufferPool *
gst_vaapi_video_buffer_pool_new(GstVaapiDisplay *display) gst_vaapi_video_buffer_pool_new (GstVaapiDisplay * display)
{ {
return g_object_new(GST_VAAPI_TYPE_VIDEO_BUFFER_POOL, return g_object_new (GST_VAAPI_TYPE_VIDEO_BUFFER_POOL,
"display", display, NULL); "display", display, NULL);
} }

View file

@ -29,27 +29,21 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define GST_VAAPI_TYPE_VIDEO_BUFFER_POOL \ #define GST_VAAPI_TYPE_VIDEO_BUFFER_POOL \
(gst_vaapi_video_buffer_pool_get_type()) (gst_vaapi_video_buffer_pool_get_type ())
#define GST_VAAPI_VIDEO_BUFFER_POOL(obj) \
#define GST_VAAPI_VIDEO_BUFFER_POOL(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_VAAPI_TYPE_VIDEO_BUFFER_POOL, \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \ GstVaapiVideoBufferPool))
GST_VAAPI_TYPE_VIDEO_BUFFER_POOL, \ #define GST_VAAPI_VIDEO_BUFFER_POOL_CLASS(klass) \
GstVaapiVideoBufferPool)) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_VAAPI_TYPE_VIDEO_BUFFER_POOL, \
GstVaapiVideoBufferPoolClass))
#define GST_VAAPI_VIDEO_BUFFER_POOL_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
GST_VAAPI_TYPE_VIDEO_BUFFER_POOL, \
GstVaapiVideoBufferPoolClass))
#define GST_VAAPI_IS_VIDEO_BUFFER_POOL(obj) \ #define GST_VAAPI_IS_VIDEO_BUFFER_POOL(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_VIDEO_BUFFER_POOL)) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_VAAPI_TYPE_VIDEO_BUFFER_POOL))
#define GST_VAAPI_IS_VIDEO_BUFFER_POOL_CLASS(klass) \ #define GST_VAAPI_IS_VIDEO_BUFFER_POOL_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_VIDEO_BUFFER_POOL)) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_VAAPI_TYPE_VIDEO_BUFFER_POOL))
typedef struct _GstVaapiVideoBufferPool GstVaapiVideoBufferPool; typedef struct _GstVaapiVideoBufferPool GstVaapiVideoBufferPool;
typedef struct _GstVaapiVideoBufferPoolClass GstVaapiVideoBufferPoolClass; typedef struct _GstVaapiVideoBufferPoolClass GstVaapiVideoBufferPoolClass;
typedef struct _GstVaapiVideoBufferPoolPrivate GstVaapiVideoBufferPoolPrivate; typedef struct _GstVaapiVideoBufferPoolPrivate GstVaapiVideoBufferPoolPrivate;
/** /**
* GST_BUFFER_POOL_OPTION_VAAPI_VIDEO_META: * GST_BUFFER_POOL_OPTION_VAAPI_VIDEO_META:
@ -57,7 +51,8 @@ typedef struct _GstVaapiVideoBufferPoolPrivate GstVaapiVideoBufferPoolPrivate;
* An option that can be activated on bufferpool to request vaapi * An option that can be activated on bufferpool to request vaapi
* video metadata on buffers from the pool. * video metadata on buffers from the pool.
*/ */
#define GST_BUFFER_POOL_OPTION_VAAPI_VIDEO_META "GstBufferPoolOptionVaapiVideoMeta" #define GST_BUFFER_POOL_OPTION_VAAPI_VIDEO_META \
"GstBufferPoolOptionVaapiVideoMeta"
/** /**
* *
@ -71,7 +66,7 @@ typedef struct _GstVaapiVideoBufferPoolPrivate GstVaapiVideoBufferPoolPrivate;
*/ */
#ifndef GST_BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META #ifndef GST_BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META
#define GST_BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META \ #define GST_BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META \
"GstBufferPoolOptionVideoGLTextureUploadMeta" "GstBufferPoolOptionVideoGLTextureUploadMeta"
#endif #endif
/** /**
@ -79,11 +74,12 @@ typedef struct _GstVaapiVideoBufferPoolPrivate GstVaapiVideoBufferPoolPrivate;
* *
* A VA video buffer pool object. * A VA video buffer pool object.
*/ */
struct _GstVaapiVideoBufferPool { struct _GstVaapiVideoBufferPool
GstBufferPool parent_instance; {
GstBufferPool parent_instance;
/*< private >*/ /*< private >*/
GstVaapiVideoBufferPoolPrivate *priv; GstVaapiVideoBufferPoolPrivate *priv;
}; };
/** /**
@ -91,17 +87,18 @@ struct _GstVaapiVideoBufferPool {
* *
* A VA video buffer pool class. * A VA video buffer pool class.
*/ */
struct _GstVaapiVideoBufferPoolClass { struct _GstVaapiVideoBufferPoolClass
GstBufferPoolClass parent_class; {
GstBufferPoolClass parent_class;
}; };
G_GNUC_INTERNAL G_GNUC_INTERNAL
GType GType
gst_vaapi_video_buffer_pool_get_type(void) G_GNUC_CONST; gst_vaapi_video_buffer_pool_get_type (void) G_GNUC_CONST;
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstBufferPool * GstBufferPool *
gst_vaapi_video_buffer_pool_new(GstVaapiDisplay *display) G_GNUC_CONST; gst_vaapi_video_buffer_pool_new (GstVaapiDisplay * display) G_GNUC_CONST;
G_END_DECLS G_END_DECLS

View file

@ -31,18 +31,18 @@
GST_DEBUG_CATEGORY_STATIC (GST_CAT_CONTEXT); GST_DEBUG_CATEGORY_STATIC (GST_CAT_CONTEXT);
#define GST_VAAPI_TYPE_DISPLAY \ #define GST_VAAPI_TYPE_DISPLAY \
gst_vaapi_display_get_type() gst_vaapi_display_get_type ()
GType GType
gst_vaapi_display_get_type (void) gst_vaapi_display_get_type (void) G_GNUC_CONST;
G_GNUC_CONST;
G_DEFINE_BOXED_TYPE (GstVaapiDisplay, gst_vaapi_display, G_DEFINE_BOXED_TYPE (GstVaapiDisplay, gst_vaapi_display,
(GBoxedCopyFunc) gst_vaapi_display_ref, (GBoxedCopyFunc) gst_vaapi_display_ref,
(GBoxedFreeFunc) gst_vaapi_display_unref) (GBoxedFreeFunc) gst_vaapi_display_unref);
GstContext *gst_vaapi_video_context_new_with_display (GstVaapiDisplay * GstContext *
display, gboolean persistent) gst_vaapi_video_context_new_with_display (GstVaapiDisplay * display,
gboolean persistent)
{ {
GstContext *context; GstContext *context;
GstStructure *structure; GstStructure *structure;

View file

@ -34,8 +34,8 @@
#define GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME "gst.vaapi.Display" #define GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME "gst.vaapi.Display"
/* Fake GstVideoContext symbols */ /* Fake GstVideoContext symbols */
#define GST_VIDEO_CONTEXT(obj) (GST_ELEMENT(obj)) #define GST_VIDEO_CONTEXT(obj) (GST_ELEMENT (obj))
#define GST_IS_VIDEO_CONTEXT(obj) (GST_IS_ELEMENT(obj)) #define GST_IS_VIDEO_CONTEXT(obj) (GST_IS_ELEMENT (obj))
#define GstVideoContext GstElement #define GstVideoContext GstElement
#define gst_video_context_prepare gst_vaapi_video_context_prepare #define gst_video_context_prepare gst_vaapi_video_context_prepare

View file

@ -30,68 +30,68 @@
#include "gstvaapivideometa.h" #include "gstvaapivideometa.h"
#if GST_CHECK_VERSION(1,0,0) #if GST_CHECK_VERSION(1,0,0)
typedef gboolean (*GstSurfaceUploadFunction)(GstSurfaceConverter *, typedef gboolean (*GstSurfaceUploadFunction) (GstSurfaceConverter *,
GstBuffer *); GstBuffer *);
#else #else
typedef gboolean (*GstSurfaceUploadFunction)(GstSurfaceConverter *, typedef gboolean (*GstSurfaceUploadFunction) (GstSurfaceConverter *,
GstSurfaceBuffer *); GstSurfaceBuffer *);
#endif #endif
static void static void
gst_vaapi_video_converter_glx_iface_init(GstSurfaceConverterInterface *iface); gst_vaapi_video_converter_glx_iface_init (GstSurfaceConverterInterface * iface);
G_DEFINE_TYPE_WITH_CODE( G_DEFINE_TYPE_WITH_CODE (GstVaapiVideoConverterGLX,
GstVaapiVideoConverterGLX,
gst_vaapi_video_converter_glx, gst_vaapi_video_converter_glx,
G_TYPE_OBJECT, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE(GST_TYPE_SURFACE_CONVERTER, G_IMPLEMENT_INTERFACE (GST_TYPE_SURFACE_CONVERTER,
gst_vaapi_video_converter_glx_iface_init)) gst_vaapi_video_converter_glx_iface_init));
#define GST_VAAPI_VIDEO_CONVERTER_GLX_GET_PRIVATE(obj) \ #define GST_VAAPI_VIDEO_CONVERTER_GLX_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE((obj), \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX, \
GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX, \ GstVaapiVideoConverterGLXPrivate))
GstVaapiVideoConverterGLXPrivate))
struct _GstVaapiVideoConverterGLXPrivate { struct _GstVaapiVideoConverterGLXPrivate
GstVaapiTexture *texture; {
GstVaapiTexture *texture;
}; };
static gboolean static gboolean
gst_vaapi_video_converter_glx_upload(GstSurfaceConverter *self, gst_vaapi_video_converter_glx_upload (GstSurfaceConverter * self,
GstBuffer *buffer); GstBuffer * buffer);
static void static void
gst_vaapi_video_converter_glx_dispose(GObject *object) gst_vaapi_video_converter_glx_dispose (GObject * object)
{ {
GstVaapiVideoConverterGLXPrivate * const priv = GstVaapiVideoConverterGLXPrivate *const priv =
GST_VAAPI_VIDEO_CONVERTER_GLX(object)->priv; GST_VAAPI_VIDEO_CONVERTER_GLX (object)->priv;
gst_vaapi_texture_replace(&priv->texture, NULL); gst_vaapi_texture_replace (&priv->texture, NULL);
G_OBJECT_CLASS(gst_vaapi_video_converter_glx_parent_class)->dispose(object); G_OBJECT_CLASS (gst_vaapi_video_converter_glx_parent_class)->dispose (object);
} }
static void static void
gst_vaapi_video_converter_glx_class_init(GstVaapiVideoConverterGLXClass *klass) gst_vaapi_video_converter_glx_class_init (GstVaapiVideoConverterGLXClass *
klass)
{ {
GObjectClass * const object_class = G_OBJECT_CLASS(klass); GObjectClass *const object_class = G_OBJECT_CLASS (klass);
g_type_class_add_private(klass, sizeof(GstVaapiVideoConverterGLXPrivate)); g_type_class_add_private (klass, sizeof (GstVaapiVideoConverterGLXPrivate));
object_class->dispose = gst_vaapi_video_converter_glx_dispose; object_class->dispose = gst_vaapi_video_converter_glx_dispose;
} }
static void static void
gst_vaapi_video_converter_glx_init(GstVaapiVideoConverterGLX *buffer) gst_vaapi_video_converter_glx_init (GstVaapiVideoConverterGLX * buffer)
{ {
buffer->priv = GST_VAAPI_VIDEO_CONVERTER_GLX_GET_PRIVATE(buffer); buffer->priv = GST_VAAPI_VIDEO_CONVERTER_GLX_GET_PRIVATE (buffer);
} }
static void static void
gst_vaapi_video_converter_glx_iface_init(GstSurfaceConverterInterface *iface) gst_vaapi_video_converter_glx_iface_init (GstSurfaceConverterInterface * iface)
{ {
iface->upload = (GstSurfaceUploadFunction) iface->upload = (GstSurfaceUploadFunction)
gst_vaapi_video_converter_glx_upload; gst_vaapi_video_converter_glx_upload;
} }
/** /**
@ -107,53 +107,53 @@ gst_vaapi_video_converter_glx_iface_init(GstSurfaceConverterInterface *iface)
* Return value: the newly allocated #GstBuffer, or %NULL on error * Return value: the newly allocated #GstBuffer, or %NULL on error
*/ */
GstSurfaceConverter * GstSurfaceConverter *
gst_vaapi_video_converter_glx_new(GstBuffer *buffer, const gchar *type, gst_vaapi_video_converter_glx_new (GstBuffer * buffer, const gchar * type,
GValue *dest) GValue * dest)
{ {
GstVaapiVideoMeta * const meta = gst_buffer_get_vaapi_video_meta(buffer); GstVaapiVideoMeta *const meta = gst_buffer_get_vaapi_video_meta (buffer);
GstVaapiTexture *texture; GstVaapiTexture *texture;
GstVaapiVideoConverterGLX *converter; GstVaapiVideoConverterGLX *converter;
/* Check for "opengl" request, or chain up to X11 converter */ /* Check for "opengl" request, or chain up to X11 converter */
if (strcmp(type, "opengl") != 0 || !G_VALUE_HOLDS_UINT(dest)) if (strcmp (type, "opengl") != 0 || !G_VALUE_HOLDS_UINT (dest))
return gst_vaapi_video_converter_x11_new(buffer, type, dest); return gst_vaapi_video_converter_x11_new (buffer, type, dest);
/* FIXME Should we assume target and format ? */ /* FIXME Should we assume target and format ? */
texture = gst_vaapi_texture_new_with_texture( texture =
gst_vaapi_video_meta_get_display(meta), gst_vaapi_texture_new_with_texture (gst_vaapi_video_meta_get_display
g_value_get_uint(dest), GL_TEXTURE_2D, GL_BGRA); (meta), g_value_get_uint (dest), GL_TEXTURE_2D, GL_BGRA);
if (!texture) if (!texture)
return NULL; return NULL;
converter = g_object_new(GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX, NULL); converter = g_object_new (GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX, NULL);
converter->priv->texture = texture; converter->priv->texture = texture;
return GST_SURFACE_CONVERTER(converter); return GST_SURFACE_CONVERTER (converter);
} }
gboolean gboolean
gst_vaapi_video_converter_glx_upload(GstSurfaceConverter *self, gst_vaapi_video_converter_glx_upload (GstSurfaceConverter * self,
GstBuffer *buffer) GstBuffer * buffer)
{ {
GstVaapiVideoConverterGLXPrivate * const priv = GstVaapiVideoConverterGLXPrivate *const priv =
GST_VAAPI_VIDEO_CONVERTER_GLX(self)->priv; GST_VAAPI_VIDEO_CONVERTER_GLX (self)->priv;
GstVaapiVideoMeta * const meta = gst_buffer_get_vaapi_video_meta(buffer); GstVaapiVideoMeta *const meta = gst_buffer_get_vaapi_video_meta (buffer);
GstVaapiSurface * const surface = gst_vaapi_video_meta_get_surface(meta); GstVaapiSurface *const surface = gst_vaapi_video_meta_get_surface (meta);
GstVaapiDisplay *new_dpy, *old_dpy; GstVaapiDisplay *new_dpy, *old_dpy;
new_dpy = gst_vaapi_object_get_display(GST_VAAPI_OBJECT(surface)); new_dpy = gst_vaapi_object_get_display (GST_VAAPI_OBJECT (surface));
old_dpy = gst_vaapi_object_get_display(GST_VAAPI_OBJECT(priv->texture)); old_dpy = gst_vaapi_object_get_display (GST_VAAPI_OBJECT (priv->texture));
if (old_dpy != new_dpy) { if (old_dpy != new_dpy) {
const guint texture = gst_vaapi_texture_get_id(priv->texture); const guint texture = gst_vaapi_texture_get_id (priv->texture);
gst_vaapi_texture_replace(&priv->texture, NULL); gst_vaapi_texture_replace (&priv->texture, NULL);
priv->texture = gst_vaapi_texture_new_with_texture(new_dpy, priv->texture = gst_vaapi_texture_new_with_texture (new_dpy,
texture, GL_TEXTURE_2D, GL_BGRA); texture, GL_TEXTURE_2D, GL_BGRA);
} }
if (!gst_vaapi_apply_composition(surface, buffer)) if (!gst_vaapi_apply_composition (surface, buffer))
GST_WARNING("could not update subtitles"); GST_WARNING ("could not update subtitles");
return gst_vaapi_texture_put_surface(priv->texture, surface, return gst_vaapi_texture_put_surface (priv->texture, surface,
gst_vaapi_video_meta_get_render_flags(meta)); gst_vaapi_video_meta_get_render_flags (meta));
} }

View file

@ -31,43 +31,37 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX \ #define GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX \
(gst_vaapi_video_converter_glx_get_type ()) (gst_vaapi_video_converter_glx_get_type ())
#define GST_VAAPI_VIDEO_CONVERTER_GLX(obj) \
#define GST_VAAPI_VIDEO_CONVERTER_GLX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX, \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \ GstVaapiVideoConverterGLX))
GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX, \ #define GST_VAAPI_VIDEO_CONVERTER_GLX_CLASS(klass) \
GstVaapiVideoConverterGLX)) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX, \
GstVaapiVideoConverterGLXClass))
#define GST_VAAPI_VIDEO_CONVERTER_GLX_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX, \
GstVaapiVideoConverterGLXClass))
#define GST_VAAPI_IS_VIDEO_CONVERTER_GLX(obj) \ #define GST_VAAPI_IS_VIDEO_CONVERTER_GLX(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX)) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX))
#define GST_VAAPI_IS_VIDEO_CONVERTER_GLX_CLASS(klass) \ #define GST_VAAPI_IS_VIDEO_CONVERTER_GLX_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX)) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX))
#define GST_VAAPI_VIDEO_CONVERTER_GLX_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX, \
GstVaapiVideoConverterGLXClass))
#define GST_VAAPI_VIDEO_CONVERTER_GLX_GET_CLASS(obj) \ typedef struct _GstVaapiVideoConverterGLX GstVaapiVideoConverterGLX;
(G_TYPE_INSTANCE_GET_CLASS((obj), \ typedef struct _GstVaapiVideoConverterGLXPrivate
GST_VAAPI_TYPE_VIDEO_CONVERTER_GLX, \ GstVaapiVideoConverterGLXPrivate;
GstVaapiVideoConverterGLXClass)) typedef struct _GstVaapiVideoConverterGLXClass GstVaapiVideoConverterGLXClass;
typedef struct _GstVaapiVideoConverterGLX GstVaapiVideoConverterGLX;
typedef struct _GstVaapiVideoConverterGLXPrivate GstVaapiVideoConverterGLXPrivate;
typedef struct _GstVaapiVideoConverterGLXClass GstVaapiVideoConverterGLXClass;
/** /**
* GstVaapiVideoConverterGLX: * GstVaapiVideoConverterGLX:
* *
* Converter to transform VA buffers into GL textures. * Converter to transform VA buffers into GL textures.
*/ */
struct _GstVaapiVideoConverterGLX { struct _GstVaapiVideoConverterGLX
/*< private >*/ {
GObject parent_instance; /*< private >*/
GObject parent_instance;
GstVaapiVideoConverterGLXPrivate *priv; GstVaapiVideoConverterGLXPrivate *priv;
}; };
/** /**
@ -75,19 +69,20 @@ struct _GstVaapiVideoConverterGLX {
* *
* Converter class to transform VA buffers into GL textures. * Converter class to transform VA buffers into GL textures.
*/ */
struct _GstVaapiVideoConverterGLXClass { struct _GstVaapiVideoConverterGLXClass
/*< private >*/ {
GObjectClass parent_class; /*< private >*/
GObjectClass parent_class;
}; };
G_GNUC_INTERNAL G_GNUC_INTERNAL
GType GType
gst_vaapi_video_converter_glx_get_type(void) G_GNUC_CONST; gst_vaapi_video_converter_glx_get_type (void) G_GNUC_CONST;
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstSurfaceConverter * GstSurfaceConverter *
gst_vaapi_video_converter_glx_new(GstBuffer *buffer, const gchar *type, gst_vaapi_video_converter_glx_new (GstBuffer * buffer, const gchar * type,
GValue *dest); GValue * dest);
G_END_DECLS G_END_DECLS

View file

@ -27,86 +27,86 @@
#include "gstvaapivideometa.h" #include "gstvaapivideometa.h"
#if GST_CHECK_VERSION(1,0,0) #if GST_CHECK_VERSION(1,0,0)
typedef gboolean (*GstSurfaceUploadFunction)(GstSurfaceConverter *, typedef gboolean (*GstSurfaceUploadFunction) (GstSurfaceConverter *,
GstBuffer *); GstBuffer *);
#else #else
typedef gboolean (*GstSurfaceUploadFunction)(GstSurfaceConverter *, typedef gboolean (*GstSurfaceUploadFunction) (GstSurfaceConverter *,
GstSurfaceBuffer *); GstSurfaceBuffer *);
#endif #endif
static void static void
gst_vaapi_video_converter_x11_iface_init(GstSurfaceConverterInterface *iface); gst_vaapi_video_converter_x11_iface_init (GstSurfaceConverterInterface * iface);
G_DEFINE_TYPE_WITH_CODE( G_DEFINE_TYPE_WITH_CODE (GstVaapiVideoConverterX11,
GstVaapiVideoConverterX11,
gst_vaapi_video_converter_x11, gst_vaapi_video_converter_x11,
G_TYPE_OBJECT, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE(GST_TYPE_SURFACE_CONVERTER, G_IMPLEMENT_INTERFACE (GST_TYPE_SURFACE_CONVERTER,
gst_vaapi_video_converter_x11_iface_init)) gst_vaapi_video_converter_x11_iface_init));
#define GST_VAAPI_VIDEO_CONVERTER_X11_GET_PRIVATE(obj) \ #define GST_VAAPI_VIDEO_CONVERTER_X11_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE((obj), \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_VAAPI_TYPE_VIDEO_CONVERTER_X11, \
GST_VAAPI_TYPE_VIDEO_CONVERTER_X11, \ GstVaapiVideoConverterX11Private))
GstVaapiVideoConverterX11Private))
struct _GstVaapiVideoConverterX11Private { struct _GstVaapiVideoConverterX11Private
GstVaapiPixmap *pixmap; {
XID pixmap_id; GstVaapiPixmap *pixmap;
XID pixmap_id;
}; };
static gboolean static gboolean
gst_vaapi_video_converter_x11_upload(GstSurfaceConverter *self, gst_vaapi_video_converter_x11_upload (GstSurfaceConverter * self,
GstBuffer *buffer); GstBuffer * buffer);
static void static void
gst_vaapi_video_converter_x11_dispose(GObject *object) gst_vaapi_video_converter_x11_dispose (GObject * object)
{ {
GstVaapiVideoConverterX11Private * const priv = GstVaapiVideoConverterX11Private *const priv =
GST_VAAPI_VIDEO_CONVERTER_X11(object)->priv; GST_VAAPI_VIDEO_CONVERTER_X11 (object)->priv;
gst_vaapi_pixmap_replace(&priv->pixmap, NULL); gst_vaapi_pixmap_replace (&priv->pixmap, NULL);
G_OBJECT_CLASS(gst_vaapi_video_converter_x11_parent_class)->dispose(object); G_OBJECT_CLASS (gst_vaapi_video_converter_x11_parent_class)->dispose (object);
} }
static void static void
gst_vaapi_video_converter_x11_class_init(GstVaapiVideoConverterX11Class *klass) gst_vaapi_video_converter_x11_class_init (GstVaapiVideoConverterX11Class *
klass)
{ {
GObjectClass * const object_class = G_OBJECT_CLASS(klass); GObjectClass *const object_class = G_OBJECT_CLASS (klass);
g_type_class_add_private(klass, sizeof(GstVaapiVideoConverterX11Private)); g_type_class_add_private (klass, sizeof (GstVaapiVideoConverterX11Private));
object_class->dispose = gst_vaapi_video_converter_x11_dispose; object_class->dispose = gst_vaapi_video_converter_x11_dispose;
} }
static void static void
gst_vaapi_video_converter_x11_init(GstVaapiVideoConverterX11 *buffer) gst_vaapi_video_converter_x11_init (GstVaapiVideoConverterX11 * buffer)
{ {
buffer->priv = GST_VAAPI_VIDEO_CONVERTER_X11_GET_PRIVATE(buffer); buffer->priv = GST_VAAPI_VIDEO_CONVERTER_X11_GET_PRIVATE (buffer);
} }
static void static void
gst_vaapi_video_converter_x11_iface_init(GstSurfaceConverterInterface *iface) gst_vaapi_video_converter_x11_iface_init (GstSurfaceConverterInterface * iface)
{ {
iface->upload = (GstSurfaceUploadFunction) iface->upload = (GstSurfaceUploadFunction)
gst_vaapi_video_converter_x11_upload; gst_vaapi_video_converter_x11_upload;
} }
static gboolean static gboolean
set_pixmap(GstVaapiVideoConverterX11 *converter, GstVaapiDisplay *display, set_pixmap (GstVaapiVideoConverterX11 * converter, GstVaapiDisplay * display,
XID pixmap_id) XID pixmap_id)
{ {
GstVaapiVideoConverterX11Private * const priv = converter->priv; GstVaapiVideoConverterX11Private *const priv = converter->priv;
GstVaapiPixmap *pixmap; GstVaapiPixmap *pixmap;
pixmap = gst_vaapi_pixmap_x11_new_with_xid(display, pixmap_id); pixmap = gst_vaapi_pixmap_x11_new_with_xid (display, pixmap_id);
if (!pixmap) if (!pixmap)
return FALSE; return FALSE;
gst_vaapi_pixmap_replace(&priv->pixmap, pixmap); gst_vaapi_pixmap_replace (&priv->pixmap, pixmap);
gst_vaapi_pixmap_unref(pixmap); gst_vaapi_pixmap_unref (pixmap);
priv->pixmap_id = pixmap_id; priv->pixmap_id = pixmap_id;
return TRUE; return TRUE;
} }
/** /**
@ -122,73 +122,73 @@ set_pixmap(GstVaapiVideoConverterX11 *converter, GstVaapiDisplay *display,
* Return value: the newly allocated #GstBuffer, or %NULL on error * Return value: the newly allocated #GstBuffer, or %NULL on error
*/ */
GstSurfaceConverter * GstSurfaceConverter *
gst_vaapi_video_converter_x11_new(GstBuffer *buffer, const gchar *type, gst_vaapi_video_converter_x11_new (GstBuffer * buffer, const gchar * type,
GValue *dest) GValue * dest)
{ {
GstVaapiVideoMeta * const meta = gst_buffer_get_vaapi_video_meta(buffer); GstVaapiVideoMeta *const meta = gst_buffer_get_vaapi_video_meta (buffer);
GstVaapiVideoConverterX11 *converter; GstVaapiVideoConverterX11 *converter;
/* We only support X11 pixmap conversion */ /* We only support X11 pixmap conversion */
if (strcmp(type, "x11-pixmap") != 0 || !G_VALUE_HOLDS_UINT(dest)) if (strcmp (type, "x11-pixmap") != 0 || !G_VALUE_HOLDS_UINT (dest))
return NULL; return NULL;
converter = g_object_new(GST_VAAPI_TYPE_VIDEO_CONVERTER_X11, NULL); converter = g_object_new (GST_VAAPI_TYPE_VIDEO_CONVERTER_X11, NULL);
if (!converter) if (!converter)
return NULL; return NULL;
if (!set_pixmap(converter, gst_vaapi_video_meta_get_display(meta), if (!set_pixmap (converter, gst_vaapi_video_meta_get_display (meta),
g_value_get_uint(dest))) g_value_get_uint (dest)))
goto error; goto error;
return GST_SURFACE_CONVERTER(converter); return GST_SURFACE_CONVERTER (converter);
error: error:
g_object_unref(converter); g_object_unref (converter);
return NULL; return NULL;
} }
gboolean gboolean
gst_vaapi_video_converter_x11_upload(GstSurfaceConverter *self, gst_vaapi_video_converter_x11_upload (GstSurfaceConverter * self,
GstBuffer *buffer) GstBuffer * buffer)
{ {
GstVaapiVideoConverterX11 * const converter = GstVaapiVideoConverterX11 *const converter =
GST_VAAPI_VIDEO_CONVERTER_X11(self); GST_VAAPI_VIDEO_CONVERTER_X11 (self);
GstVaapiVideoConverterX11Private * const priv = converter->priv; GstVaapiVideoConverterX11Private *const priv = converter->priv;
GstVaapiVideoMeta * const meta = gst_buffer_get_vaapi_video_meta(buffer); GstVaapiVideoMeta *const meta = gst_buffer_get_vaapi_video_meta (buffer);
const GstVaapiRectangle *crop_rect = NULL; const GstVaapiRectangle *crop_rect = NULL;
GstVaapiSurface *surface; GstVaapiSurface *surface;
GstVaapiDisplay *old_display, *new_display; GstVaapiDisplay *old_display, *new_display;
g_return_val_if_fail(meta != NULL, FALSE); g_return_val_if_fail (meta != NULL, FALSE);
surface = gst_vaapi_video_meta_get_surface(meta); surface = gst_vaapi_video_meta_get_surface (meta);
if (!surface) if (!surface)
return FALSE; return FALSE;
old_display = gst_vaapi_object_get_display(GST_VAAPI_OBJECT(priv->pixmap)); old_display = gst_vaapi_object_get_display (GST_VAAPI_OBJECT (priv->pixmap));
new_display = gst_vaapi_object_get_display(GST_VAAPI_OBJECT(surface)); new_display = gst_vaapi_object_get_display (GST_VAAPI_OBJECT (surface));
if (old_display != new_display) { if (old_display != new_display) {
if (!set_pixmap(converter, new_display, priv->pixmap_id)) if (!set_pixmap (converter, new_display, priv->pixmap_id))
return FALSE; return FALSE;
} }
if (!gst_vaapi_apply_composition(surface, buffer)) if (!gst_vaapi_apply_composition (surface, buffer))
GST_WARNING("could not update subtitles"); GST_WARNING ("could not update subtitles");
#if GST_CHECK_VERSION(1,0,0) #if GST_CHECK_VERSION(1,0,0)
GstVideoCropMeta * const crop_meta = gst_buffer_get_video_crop_meta(buffer); GstVideoCropMeta *const crop_meta = gst_buffer_get_video_crop_meta (buffer);
if (crop_meta) { if (crop_meta) {
GstVaapiRectangle crop_rect_tmp; GstVaapiRectangle crop_rect_tmp;
crop_rect = &crop_rect_tmp; crop_rect = &crop_rect_tmp;
crop_rect_tmp.x = crop_meta->x; crop_rect_tmp.x = crop_meta->x;
crop_rect_tmp.y = crop_meta->y; crop_rect_tmp.y = crop_meta->y;
crop_rect_tmp.width = crop_meta->width; crop_rect_tmp.width = crop_meta->width;
crop_rect_tmp.height = crop_meta->height; crop_rect_tmp.height = crop_meta->height;
} }
#endif #endif
if (!crop_rect) if (!crop_rect)
crop_rect = gst_vaapi_video_meta_get_render_rect(meta); crop_rect = gst_vaapi_video_meta_get_render_rect (meta);
return gst_vaapi_pixmap_put_surface(priv->pixmap, surface, crop_rect, return gst_vaapi_pixmap_put_surface (priv->pixmap, surface, crop_rect,
gst_vaapi_video_meta_get_render_flags(meta)); gst_vaapi_video_meta_get_render_flags (meta));
} }

View file

@ -29,43 +29,37 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define GST_VAAPI_TYPE_VIDEO_CONVERTER_X11 \ #define GST_VAAPI_TYPE_VIDEO_CONVERTER_X11 \
(gst_vaapi_video_converter_x11_get_type ()) (gst_vaapi_video_converter_x11_get_type ())
#define GST_VAAPI_VIDEO_CONVERTER_X11(obj) \
#define GST_VAAPI_VIDEO_CONVERTER_X11(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_VAAPI_TYPE_VIDEO_CONVERTER_X11, \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \ GstVaapiVideoConverterX11))
GST_VAAPI_TYPE_VIDEO_CONVERTER_X11, \ #define GST_VAAPI_VIDEO_CONVERTER_X11_CLASS(klass) \
GstVaapiVideoConverterX11)) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_VAAPI_TYPE_VIDEO_CONVERTER_X11, \
GstVaapiVideoConverterX11Class))
#define GST_VAAPI_VIDEO_CONVERTER_X11_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
GST_VAAPI_TYPE_VIDEO_CONVERTER_X11, \
GstVaapiVideoConverterX11Class))
#define GST_VAAPI_IS_VIDEO_CONVERTER_X11(obj) \ #define GST_VAAPI_IS_VIDEO_CONVERTER_X11(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_VIDEO_CONVERTER_X11)) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_VAAPI_TYPE_VIDEO_CONVERTER_X11))
#define GST_VAAPI_IS_VIDEO_CONVERTER_X11_CLASS(klass) \ #define GST_VAAPI_IS_VIDEO_CONVERTER_X11_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_VIDEO_CONVERTER_X11)) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_VAAPI_TYPE_VIDEO_CONVERTER_X11))
#define GST_VAAPI_VIDEO_CONVERTER_X11_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_VAAPI_TYPE_VIDEO_CONVERTER_X11, \
GstVaapiVideoConverterX11Class))
#define GST_VAAPI_VIDEO_CONVERTER_X11_GET_CLASS(obj) \ typedef struct _GstVaapiVideoConverterX11 GstVaapiVideoConverterX11;
(G_TYPE_INSTANCE_GET_CLASS((obj), \ typedef struct _GstVaapiVideoConverterX11Private
GST_VAAPI_TYPE_VIDEO_CONVERTER_X11, \ GstVaapiVideoConverterX11Private;
GstVaapiVideoConverterX11Class)) typedef struct _GstVaapiVideoConverterX11Class GstVaapiVideoConverterX11Class;
typedef struct _GstVaapiVideoConverterX11 GstVaapiVideoConverterX11;
typedef struct _GstVaapiVideoConverterX11Private GstVaapiVideoConverterX11Private;
typedef struct _GstVaapiVideoConverterX11Class GstVaapiVideoConverterX11Class;
/** /**
* GstVaapiVideoConverterX11: * GstVaapiVideoConverterX11:
* *
* Converter to transform VA buffers into GL textures. * Converter to transform VA buffers into GL textures.
*/ */
struct _GstVaapiVideoConverterX11 { struct _GstVaapiVideoConverterX11
/*< private >*/ {
GObject parent_instance; /*< private >*/
GObject parent_instance;
GstVaapiVideoConverterX11Private *priv; GstVaapiVideoConverterX11Private *priv;
}; };
/** /**
@ -73,19 +67,20 @@ struct _GstVaapiVideoConverterX11 {
* *
* Converter class to transform VA buffers into GL textures. * Converter class to transform VA buffers into GL textures.
*/ */
struct _GstVaapiVideoConverterX11Class { struct _GstVaapiVideoConverterX11Class
/*< private >*/ {
GObjectClass parent_class; /*< private >*/
GObjectClass parent_class;
}; };
G_GNUC_INTERNAL G_GNUC_INTERNAL
GType GType
gst_vaapi_video_converter_x11_get_type(void) G_GNUC_CONST; gst_vaapi_video_converter_x11_get_type (void) G_GNUC_CONST;
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstSurfaceConverter * GstSurfaceConverter *
gst_vaapi_video_converter_x11_new(GstBuffer *buffer, const gchar *type, gst_vaapi_video_converter_x11_new (GstBuffer * buffer, const gchar * type,
GValue *dest); GValue * dest);
G_END_DECLS G_END_DECLS

File diff suppressed because it is too large Load diff

View file

@ -31,16 +31,16 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _GstVaapiVideoMemory GstVaapiVideoMemory; typedef struct _GstVaapiVideoMemory GstVaapiVideoMemory;
typedef struct _GstVaapiVideoAllocator GstVaapiVideoAllocator; typedef struct _GstVaapiVideoAllocator GstVaapiVideoAllocator;
typedef struct _GstVaapiVideoAllocatorClass GstVaapiVideoAllocatorClass; typedef struct _GstVaapiVideoAllocatorClass GstVaapiVideoAllocatorClass;
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
/* --- GstVaapiVideoMemory --- */ /* --- GstVaapiVideoMemory --- */
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
#define GST_VAAPI_VIDEO_MEMORY_CAST(mem) \ #define GST_VAAPI_VIDEO_MEMORY_CAST(mem) \
((GstVaapiVideoMemory *)(mem)) ((GstVaapiVideoMemory *) (mem))
#define GST_VAAPI_VIDEO_MEMORY_NAME "GstVaapiVideoMemory" #define GST_VAAPI_VIDEO_MEMORY_NAME "GstVaapiVideoMemory"
@ -59,10 +59,11 @@ typedef struct _GstVaapiVideoAllocatorClass GstVaapiVideoAllocatorClass;
* *
* The set of all #GstVaapiVideoMemory map types. * The set of all #GstVaapiVideoMemory map types.
*/ */
typedef enum { typedef enum
GST_VAAPI_VIDEO_MEMORY_MAP_TYPE_SURFACE = 1, {
GST_VAAPI_VIDEO_MEMORY_MAP_TYPE_PLANAR, GST_VAAPI_VIDEO_MEMORY_MAP_TYPE_SURFACE = 1,
GST_VAAPI_VIDEO_MEMORY_MAP_TYPE_LINEAR GST_VAAPI_VIDEO_MEMORY_MAP_TYPE_PLANAR,
GST_VAAPI_VIDEO_MEMORY_MAP_TYPE_LINEAR
} GstVaapiVideoMemoryMapType; } GstVaapiVideoMemoryMapType;
/** /**
@ -71,56 +72,54 @@ typedef enum {
* A VA video memory object holder, including VA surfaces, images and * A VA video memory object holder, including VA surfaces, images and
* proxies. * proxies.
*/ */
struct _GstVaapiVideoMemory { struct _GstVaapiVideoMemory
GstMemory parent_instance; {
GstMemory parent_instance;
/*< private >*/ /*< private >*/
GstVaapiSurfaceProxy *proxy; GstVaapiSurfaceProxy *proxy;
const GstVideoInfo *surface_info; const GstVideoInfo *surface_info;
GstVaapiSurface *surface; GstVaapiSurface *surface;
const GstVideoInfo *image_info; const GstVideoInfo *image_info;
GstVaapiImage *image; GstVaapiImage *image;
GstVaapiVideoMeta *meta; GstVaapiVideoMeta *meta;
guint map_type; guint map_type;
gint map_count; gint map_count;
gboolean use_direct_rendering; gboolean use_direct_rendering;
}; };
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstMemory * GstMemory *
gst_vaapi_video_memory_new(GstAllocator *allocator, GstVaapiVideoMeta *meta); gst_vaapi_video_memory_new (GstAllocator * allocator, GstVaapiVideoMeta * meta);
G_GNUC_INTERNAL G_GNUC_INTERNAL
gboolean gboolean
gst_video_meta_map_vaapi_memory(GstVideoMeta *meta, guint plane, gst_video_meta_map_vaapi_memory (GstVideoMeta * meta, guint plane,
GstMapInfo *info, gpointer *data, gint *stride, GstMapFlags flags); GstMapInfo * info, gpointer * data, gint * stride, GstMapFlags flags);
G_GNUC_INTERNAL G_GNUC_INTERNAL
gboolean gboolean
gst_video_meta_unmap_vaapi_memory(GstVideoMeta *meta, guint plane, gst_video_meta_unmap_vaapi_memory (GstVideoMeta * meta, guint plane,
GstMapInfo *info); GstMapInfo * info);
G_GNUC_INTERNAL G_GNUC_INTERNAL
void void
gst_vaapi_video_memory_reset_surface(GstVaapiVideoMemory *mem); gst_vaapi_video_memory_reset_surface (GstVaapiVideoMemory * mem);
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
/* --- GstVaapiVideoAllocator --- */ /* --- GstVaapiVideoAllocator --- */
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
#define GST_VAAPI_VIDEO_ALLOCATOR_CAST(allocator) \ #define GST_VAAPI_VIDEO_ALLOCATOR_CAST(allocator) \
((GstVaapiVideoAllocator *)(allocator)) ((GstVaapiVideoAllocator *) (allocator))
#define GST_VAAPI_TYPE_VIDEO_ALLOCATOR \ #define GST_VAAPI_TYPE_VIDEO_ALLOCATOR \
(gst_vaapi_video_allocator_get_type()) (gst_vaapi_video_allocator_get_type ())
#define GST_VAAPI_VIDEO_ALLOCATOR(obj) \
#define GST_VAAPI_VIDEO_ALLOCATOR(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_VAAPI_TYPE_VIDEO_ALLOCATOR, \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \ GstVaapiVideoAllocator))
GST_VAAPI_TYPE_VIDEO_ALLOCATOR, \
GstVaapiVideoAllocator))
#define GST_VAAPI_IS_VIDEO_ALLOCATOR(obj) \ #define GST_VAAPI_IS_VIDEO_ALLOCATOR(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_VIDEO_ALLOCATOR)) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_VAAPI_TYPE_VIDEO_ALLOCATOR))
#define GST_VAAPI_VIDEO_ALLOCATOR_NAME "GstVaapiVideoAllocator" #define GST_VAAPI_VIDEO_ALLOCATOR_NAME "GstVaapiVideoAllocator"
@ -129,16 +128,17 @@ gst_vaapi_video_memory_reset_surface(GstVaapiVideoMemory *mem);
* *
* A VA video memory allocator object. * A VA video memory allocator object.
*/ */
struct _GstVaapiVideoAllocator { struct _GstVaapiVideoAllocator
GstAllocator parent_instance; {
GstAllocator parent_instance;
/*< private >*/ /*< private >*/
GstVideoInfo video_info; GstVideoInfo video_info;
GstVideoInfo surface_info; GstVideoInfo surface_info;
GstVaapiVideoPool *surface_pool; GstVaapiVideoPool *surface_pool;
GstVideoInfo image_info; GstVideoInfo image_info;
GstVaapiVideoPool *image_pool; GstVaapiVideoPool *image_pool;
gboolean has_direct_rendering; gboolean has_direct_rendering;
}; };
/** /**
@ -146,18 +146,19 @@ struct _GstVaapiVideoAllocator {
* *
* A VA video memory allocator class. * A VA video memory allocator class.
*/ */
struct _GstVaapiVideoAllocatorClass { struct _GstVaapiVideoAllocatorClass
GstAllocatorClass parent_class; {
GstAllocatorClass parent_class;
}; };
G_GNUC_INTERNAL G_GNUC_INTERNAL
GType GType
gst_vaapi_video_allocator_get_type(void) G_GNUC_CONST; gst_vaapi_video_allocator_get_type (void) G_GNUC_CONST;
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstAllocator * GstAllocator *
gst_vaapi_video_allocator_new(GstVaapiDisplay *display, gst_vaapi_video_allocator_new (GstVaapiDisplay * display,
const GstVideoInfo *vip); const GstVideoInfo * vip);
G_END_DECLS G_END_DECLS

File diff suppressed because it is too large Load diff

View file

@ -33,112 +33,114 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _GstVaapiVideoMeta GstVaapiVideoMeta; typedef struct _GstVaapiVideoMeta GstVaapiVideoMeta;
#if GST_CHECK_VERSION(1,0,0) #if GST_CHECK_VERSION(1,0,0)
#define GST_VAAPI_VIDEO_META_API_TYPE \ #define GST_VAAPI_VIDEO_META_API_TYPE \
gst_vaapi_video_meta_api_get_type() gst_vaapi_video_meta_api_get_type ()
G_GNUC_INTERNAL G_GNUC_INTERNAL
GType GType
gst_vaapi_video_meta_api_get_type(void) G_GNUC_CONST; gst_vaapi_video_meta_api_get_type (void) G_GNUC_CONST;
#endif #endif
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiVideoMeta * GstVaapiVideoMeta *
gst_vaapi_video_meta_copy(GstVaapiVideoMeta *meta); gst_vaapi_video_meta_copy (GstVaapiVideoMeta * meta);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiVideoMeta * GstVaapiVideoMeta *
gst_vaapi_video_meta_new(GstVaapiDisplay *display); gst_vaapi_video_meta_new (GstVaapiDisplay * display);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiVideoMeta * GstVaapiVideoMeta *
gst_vaapi_video_meta_new_from_pool(GstVaapiVideoPool *pool); gst_vaapi_video_meta_new_from_pool (GstVaapiVideoPool * pool);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiVideoMeta * GstVaapiVideoMeta *
gst_vaapi_video_meta_new_with_image(GstVaapiImage *image); gst_vaapi_video_meta_new_with_image (GstVaapiImage * image);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiVideoMeta * GstVaapiVideoMeta *
gst_vaapi_video_meta_new_with_surface_proxy(GstVaapiSurfaceProxy *proxy); gst_vaapi_video_meta_new_with_surface_proxy (GstVaapiSurfaceProxy * proxy);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiVideoMeta * GstVaapiVideoMeta *
gst_vaapi_video_meta_ref(GstVaapiVideoMeta *meta); gst_vaapi_video_meta_ref (GstVaapiVideoMeta * meta);
G_GNUC_INTERNAL G_GNUC_INTERNAL
void void
gst_vaapi_video_meta_unref(GstVaapiVideoMeta *meta); gst_vaapi_video_meta_unref (GstVaapiVideoMeta * meta);
G_GNUC_INTERNAL G_GNUC_INTERNAL
void void
gst_vaapi_video_meta_replace(GstVaapiVideoMeta **old_meta_ptr, gst_vaapi_video_meta_replace (GstVaapiVideoMeta ** old_meta_ptr,
GstVaapiVideoMeta *new_meta); GstVaapiVideoMeta * new_meta);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiDisplay * GstVaapiDisplay *
gst_vaapi_video_meta_get_display(GstVaapiVideoMeta *meta); gst_vaapi_video_meta_get_display (GstVaapiVideoMeta * meta);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiImage * GstVaapiImage *
gst_vaapi_video_meta_get_image(GstVaapiVideoMeta *meta); gst_vaapi_video_meta_get_image (GstVaapiVideoMeta * meta);
G_GNUC_INTERNAL G_GNUC_INTERNAL
void void
gst_vaapi_video_meta_set_image(GstVaapiVideoMeta *meta, GstVaapiImage *image); gst_vaapi_video_meta_set_image (GstVaapiVideoMeta * meta,
GstVaapiImage * image);
G_GNUC_INTERNAL G_GNUC_INTERNAL
gboolean gboolean
gst_vaapi_video_meta_set_image_from_pool(GstVaapiVideoMeta *meta, gst_vaapi_video_meta_set_image_from_pool (GstVaapiVideoMeta * meta,
GstVaapiVideoPool *pool); GstVaapiVideoPool * pool);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiSurface * GstVaapiSurface *
gst_vaapi_video_meta_get_surface(GstVaapiVideoMeta *meta); gst_vaapi_video_meta_get_surface (GstVaapiVideoMeta * meta);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiSurfaceProxy * GstVaapiSurfaceProxy *
gst_vaapi_video_meta_get_surface_proxy(GstVaapiVideoMeta *meta); gst_vaapi_video_meta_get_surface_proxy (GstVaapiVideoMeta * meta);
G_GNUC_INTERNAL G_GNUC_INTERNAL
void void
gst_vaapi_video_meta_set_surface_proxy(GstVaapiVideoMeta *meta, gst_vaapi_video_meta_set_surface_proxy (GstVaapiVideoMeta * meta,
GstVaapiSurfaceProxy *proxy); GstVaapiSurfaceProxy * proxy);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GFunc GFunc
gst_vaapi_video_meta_get_surface_converter(GstVaapiVideoMeta *meta); gst_vaapi_video_meta_get_surface_converter (GstVaapiVideoMeta * meta);
G_GNUC_INTERNAL G_GNUC_INTERNAL
void void
gst_vaapi_video_meta_set_surface_converter(GstVaapiVideoMeta *meta, GFunc func); gst_vaapi_video_meta_set_surface_converter (GstVaapiVideoMeta * meta,
GFunc func);
G_GNUC_INTERNAL G_GNUC_INTERNAL
guint guint
gst_vaapi_video_meta_get_render_flags(GstVaapiVideoMeta *meta); gst_vaapi_video_meta_get_render_flags (GstVaapiVideoMeta * meta);
G_GNUC_INTERNAL G_GNUC_INTERNAL
void void
gst_vaapi_video_meta_set_render_flags(GstVaapiVideoMeta *meta, guint flags); gst_vaapi_video_meta_set_render_flags (GstVaapiVideoMeta * meta, guint flags);
G_GNUC_INTERNAL G_GNUC_INTERNAL
const GstVaapiRectangle * const GstVaapiRectangle *
gst_vaapi_video_meta_get_render_rect(GstVaapiVideoMeta *meta); gst_vaapi_video_meta_get_render_rect (GstVaapiVideoMeta * meta);
G_GNUC_INTERNAL G_GNUC_INTERNAL
void void
gst_vaapi_video_meta_set_render_rect(GstVaapiVideoMeta *meta, gst_vaapi_video_meta_set_render_rect (GstVaapiVideoMeta * meta,
const GstVaapiRectangle *rect); const GstVaapiRectangle * rect);
G_GNUC_INTERNAL G_GNUC_INTERNAL
GstVaapiVideoMeta * GstVaapiVideoMeta *
gst_buffer_get_vaapi_video_meta(GstBuffer *buffer); gst_buffer_get_vaapi_video_meta (GstBuffer * buffer);
G_GNUC_INTERNAL G_GNUC_INTERNAL
void void
gst_buffer_set_vaapi_video_meta(GstBuffer *buffer, GstVaapiVideoMeta *meta); gst_buffer_set_vaapi_video_meta (GstBuffer * buffer, GstVaapiVideoMeta * meta);
G_END_DECLS G_END_DECLS

View file

@ -30,108 +30,110 @@
#include "gstvaapipluginutil.h" #include "gstvaapipluginutil.h"
#if GST_CHECK_VERSION(1,1,0) && USE_GLX #if GST_CHECK_VERSION(1,1,0) && USE_GLX
struct _GstVaapiVideoMetaTexture { struct _GstVaapiVideoMetaTexture
GstVaapiTexture *texture; {
GstVaapiTexture *texture;
}; };
static void static void
meta_texture_free(GstVaapiVideoMetaTexture *meta) meta_texture_free (GstVaapiVideoMetaTexture * meta)
{ {
if (G_UNLIKELY(!meta)) if (G_UNLIKELY (!meta))
return; return;
gst_vaapi_texture_replace(&meta->texture, NULL); gst_vaapi_texture_replace (&meta->texture, NULL);
g_slice_free(GstVaapiVideoMetaTexture, meta); g_slice_free (GstVaapiVideoMetaTexture, meta);
} }
static GstVaapiVideoMetaTexture * static GstVaapiVideoMetaTexture *
meta_texture_new(void) meta_texture_new (void)
{ {
GstVaapiVideoMetaTexture *meta; GstVaapiVideoMetaTexture *meta;
meta = g_slice_new(GstVaapiVideoMetaTexture); meta = g_slice_new (GstVaapiVideoMetaTexture);
if (!meta) if (!meta)
return NULL; return NULL;
meta->texture = NULL; meta->texture = NULL;
return meta; return meta;
} }
static GstVaapiVideoMetaTexture * static GstVaapiVideoMetaTexture *
meta_texture_copy(GstVaapiVideoMetaTexture *meta) meta_texture_copy (GstVaapiVideoMetaTexture * meta)
{ {
GstVaapiVideoMetaTexture *copy; GstVaapiVideoMetaTexture *copy;
copy = meta_texture_new(); copy = meta_texture_new ();
if (!copy) if (!copy)
return NULL; return NULL;
gst_vaapi_texture_replace(&copy->texture, meta->texture); gst_vaapi_texture_replace (&copy->texture, meta->texture);
return copy; return copy;
} }
static gboolean static gboolean
gst_vaapi_texture_upload(GstVideoGLTextureUploadMeta *meta, guint texture_id[4]) gst_vaapi_texture_upload (GstVideoGLTextureUploadMeta * meta,
guint texture_id[4])
{ {
GstVaapiVideoMeta * const vmeta = GstVaapiVideoMeta *const vmeta =
gst_buffer_get_vaapi_video_meta(meta->buffer); gst_buffer_get_vaapi_video_meta (meta->buffer);
GstVaapiVideoMetaTexture * const meta_texture = meta->user_data; GstVaapiVideoMetaTexture *const meta_texture = meta->user_data;
GstVaapiSurface * const surface = gst_vaapi_video_meta_get_surface(vmeta); GstVaapiSurface *const surface = gst_vaapi_video_meta_get_surface (vmeta);
GstVaapiDisplay * const dpy = GST_VAAPI_OBJECT_DISPLAY(surface); GstVaapiDisplay *const dpy = GST_VAAPI_OBJECT_DISPLAY (surface);
if (gst_vaapi_display_get_display_type(dpy) != GST_VAAPI_DISPLAY_TYPE_GLX) if (gst_vaapi_display_get_display_type (dpy) != GST_VAAPI_DISPLAY_TYPE_GLX)
return FALSE; return FALSE;
if (!meta_texture->texture || if (!meta_texture->texture ||
/* Check whether VA display changed */ /* Check whether VA display changed */
GST_VAAPI_OBJECT_DISPLAY(meta_texture->texture) != dpy || GST_VAAPI_OBJECT_DISPLAY (meta_texture->texture) != dpy ||
/* Check whether texture id changed */ /* Check whether texture id changed */
gst_vaapi_texture_get_id(meta_texture->texture) != texture_id[0]) { gst_vaapi_texture_get_id (meta_texture->texture) != texture_id[0]) {
/* FIXME: should we assume target? */ /* FIXME: should we assume target? */
GstVaapiTexture * const texture = GstVaapiTexture *const texture =
gst_vaapi_texture_new_with_texture(dpy, texture_id[0], gst_vaapi_texture_new_with_texture (dpy, texture_id[0],
GL_TEXTURE_2D, GL_RGBA); GL_TEXTURE_2D, GL_RGBA);
gst_vaapi_texture_replace(&meta_texture->texture, texture); gst_vaapi_texture_replace (&meta_texture->texture, texture);
if (!texture) if (!texture)
return FALSE; return FALSE;
gst_vaapi_texture_unref(texture); gst_vaapi_texture_unref (texture);
} }
return gst_vaapi_texture_put_surface(meta_texture->texture, surface, return gst_vaapi_texture_put_surface (meta_texture->texture, surface,
gst_vaapi_video_meta_get_render_flags(vmeta)); gst_vaapi_video_meta_get_render_flags (vmeta));
} }
gboolean gboolean
gst_buffer_add_texture_upload_meta(GstBuffer *buffer) gst_buffer_add_texture_upload_meta (GstBuffer * buffer)
{ {
GstVideoGLTextureUploadMeta *meta = NULL; GstVideoGLTextureUploadMeta *meta = NULL;
GstVideoGLTextureType tex_type[] = { GST_VIDEO_GL_TEXTURE_TYPE_RGBA }; GstVideoGLTextureType tex_type[] = { GST_VIDEO_GL_TEXTURE_TYPE_RGBA };
GstVaapiVideoMetaTexture *meta_texture; GstVaapiVideoMetaTexture *meta_texture;
if (!buffer) if (!buffer)
return FALSE; return FALSE;
meta_texture = meta_texture_new(); meta_texture = meta_texture_new ();
if (!meta_texture) if (!meta_texture)
return FALSE; return FALSE;
meta = gst_buffer_add_video_gl_texture_upload_meta(buffer, meta = gst_buffer_add_video_gl_texture_upload_meta (buffer,
GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_NORMAL, GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_NORMAL,
1, tex_type, gst_vaapi_texture_upload, 1, tex_type, gst_vaapi_texture_upload,
meta_texture, (GBoxedCopyFunc)meta_texture_copy, meta_texture, (GBoxedCopyFunc) meta_texture_copy,
(GBoxedFreeFunc)meta_texture_free); (GBoxedFreeFunc) meta_texture_free);
if (!meta) if (!meta)
goto error; goto error;
return TRUE; return TRUE;
error: error:
meta_texture_free(meta_texture); meta_texture_free (meta_texture);
return FALSE; return FALSE;
} }
gboolean gboolean
gst_buffer_ensure_texture_upload_meta(GstBuffer *buffer) gst_buffer_ensure_texture_upload_meta (GstBuffer * buffer)
{ {
return gst_buffer_get_video_gl_texture_upload_meta(buffer) || return gst_buffer_get_video_gl_texture_upload_meta (buffer) ||
gst_buffer_add_texture_upload_meta(buffer); gst_buffer_add_texture_upload_meta (buffer);
} }
#endif #endif

View file

@ -31,15 +31,15 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _GstVaapiVideoMetaTexture GstVaapiVideoMetaTexture; typedef struct _GstVaapiVideoMetaTexture GstVaapiVideoMetaTexture;
G_GNUC_INTERNAL G_GNUC_INTERNAL
gboolean gboolean
gst_buffer_add_texture_upload_meta(GstBuffer *buffer); gst_buffer_add_texture_upload_meta (GstBuffer * buffer);
G_GNUC_INTERNAL G_GNUC_INTERNAL
gboolean gboolean
gst_buffer_ensure_texture_upload_meta(GstBuffer *buffer); gst_buffer_ensure_texture_upload_meta (GstBuffer * buffer);
G_END_DECLS G_END_DECLS