2010-03-12 23:48:50 +00:00
|
|
|
/*
|
2013-03-21 16:06:43 +00:00
|
|
|
* gstvaapivideobuffer.c - Gstreamer/VA video buffer
|
2010-03-12 23:48:50 +00:00
|
|
|
*
|
2012-01-16 09:41:10 +00:00
|
|
|
* Copyright (C) 2010-2011 Splitted-Desktop Systems
|
2013-01-29 13:14:45 +00:00
|
|
|
* Copyright (C) 2011-2013 Intel Corporation
|
2010-03-12 23:48:50 +00:00
|
|
|
*
|
2011-06-14 11:51:41 +00:00
|
|
|
* 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.
|
2010-03-12 23:48:50 +00:00
|
|
|
*
|
2011-06-14 11:51:41 +00:00
|
|
|
* This library is distributed in the hope that it will be useful,
|
2010-03-12 23:48:50 +00:00
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2011-06-14 11:51:41 +00:00
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
2010-03-12 23:48:50 +00:00
|
|
|
*
|
2011-06-14 11:51:41 +00:00
|
|
|
* 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
|
2010-03-12 23:48:50 +00:00
|
|
|
*/
|
|
|
|
|
2010-03-19 16:41:52 +00:00
|
|
|
/**
|
2010-03-24 08:16:32 +00:00
|
|
|
* SECTION:gstvaapivideobuffer
|
|
|
|
* @short_description: VA video buffer for GStreamer
|
2010-03-19 16:41:52 +00:00
|
|
|
*/
|
|
|
|
|
2013-03-21 16:06:43 +00:00
|
|
|
#include "gst/vaapi/sysdeps.h"
|
|
|
|
#include <gst/video/gstsurfacebuffer.h>
|
2010-03-12 23:48:50 +00:00
|
|
|
#include "gstvaapivideobuffer.h"
|
2013-03-21 16:17:53 +00:00
|
|
|
#if USE_GLX
|
|
|
|
# include "gstvaapivideoconverter_glx.h"
|
|
|
|
#endif
|
2010-03-12 23:48:50 +00:00
|
|
|
|
2013-03-21 16:06:43 +00:00
|
|
|
#define GST_VAAPI_TYPE_VIDEO_BUFFER \
|
|
|
|
(gst_vaapi_video_buffer_get_type())
|
|
|
|
|
|
|
|
#define GST_VAAPI_VIDEO_BUFFER(obj) \
|
|
|
|
(G_TYPE_CHECK_INSTANCE_CAST((obj), \
|
|
|
|
GST_VAAPI_TYPE_VIDEO_BUFFER, \
|
|
|
|
GstVaapiVideoBuffer))
|
|
|
|
|
|
|
|
#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) \
|
|
|
|
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_VIDEO_BUFFER))
|
|
|
|
|
|
|
|
#define GST_VAAPI_IS_VIDEO_BUFFER_CLASS(klass) \
|
|
|
|
(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))
|
|
|
|
|
|
|
|
typedef struct _GstVaapiVideoBufferClass GstVaapiVideoBufferClass;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* GstVaapiVideoBuffer:
|
|
|
|
*
|
|
|
|
* A #GstBuffer holding video objects (#GstVaapiSurface and #GstVaapiImage).
|
|
|
|
*/
|
|
|
|
struct _GstVaapiVideoBuffer {
|
|
|
|
/*< private >*/
|
|
|
|
GstSurfaceBuffer parent_instance;
|
|
|
|
|
|
|
|
GstVaapiVideoMeta *meta;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* GstVaapiVideoBufferClass:
|
|
|
|
*
|
|
|
|
* A #GstBuffer holding video objects
|
|
|
|
*/
|
|
|
|
struct _GstVaapiVideoBufferClass {
|
|
|
|
/*< private >*/
|
|
|
|
GstSurfaceBufferClass parent_class;
|
|
|
|
};
|
|
|
|
|
|
|
|
GType
|
|
|
|
gst_vaapi_video_buffer_get_type(void) G_GNUC_CONST;
|
2010-03-12 23:48:50 +00:00
|
|
|
|
2013-01-05 16:37:13 +00:00
|
|
|
G_DEFINE_TYPE(GstVaapiVideoBuffer,
|
|
|
|
gst_vaapi_video_buffer,
|
|
|
|
GST_TYPE_SURFACE_BUFFER)
|
2010-03-12 23:48:50 +00:00
|
|
|
|
2013-01-05 16:37:13 +00:00
|
|
|
typedef GstSurfaceConverter *(*GstSurfaceConverterCreateFunc)(
|
|
|
|
GstSurfaceBuffer *surface, const gchar *type, GValue *dest);
|
2010-03-12 23:48:50 +00:00
|
|
|
|
2013-01-05 16:37:13 +00:00
|
|
|
static GstSurfaceConverter *
|
|
|
|
gst_vaapi_video_buffer_create_converter(GstSurfaceBuffer *surface,
|
|
|
|
const gchar *type, GValue *dest)
|
2010-03-16 17:10:02 +00:00
|
|
|
{
|
2013-01-05 16:37:13 +00:00
|
|
|
GstVaapiVideoBuffer * const vbuffer = GST_VAAPI_VIDEO_BUFFER(surface);
|
|
|
|
GstSurfaceConverterCreateFunc func;
|
2010-03-12 23:48:50 +00:00
|
|
|
|
2013-01-05 16:37:13 +00:00
|
|
|
func = (GstSurfaceConverterCreateFunc)
|
|
|
|
gst_vaapi_video_meta_get_surface_converter(vbuffer->meta);
|
2010-05-11 16:19:30 +00:00
|
|
|
|
2013-01-05 16:37:13 +00:00
|
|
|
return func ? func(surface, type, dest) : NULL;
|
2010-03-12 23:48:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_vaapi_video_buffer_class_init(GstVaapiVideoBufferClass *klass)
|
|
|
|
{
|
2013-01-05 16:37:13 +00:00
|
|
|
GstSurfaceBufferClass * const surface_class =
|
|
|
|
GST_SURFACE_BUFFER_CLASS(klass);
|
2010-03-12 23:48:50 +00:00
|
|
|
|
2013-01-05 16:37:13 +00:00
|
|
|
surface_class->create_converter = gst_vaapi_video_buffer_create_converter;
|
2010-03-12 23:48:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_vaapi_video_buffer_init(GstVaapiVideoBuffer *buffer)
|
|
|
|
{
|
2012-07-24 11:52:06 +00:00
|
|
|
}
|
|
|
|
|
2013-03-21 16:17:53 +00:00
|
|
|
static GFunc
|
|
|
|
get_surface_converter(GstVaapiDisplay *display)
|
|
|
|
{
|
|
|
|
GFunc func;
|
|
|
|
|
|
|
|
switch (gst_vaapi_display_get_display_type(display)) {
|
|
|
|
#if USE_GLX
|
|
|
|
case GST_VAAPI_DISPLAY_TYPE_GLX:
|
|
|
|
func = (GFunc)gst_vaapi_video_converter_glx_new;
|
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
default:
|
|
|
|
func = NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return func;
|
|
|
|
}
|
|
|
|
|
|
|
|
static GstBuffer *
|
|
|
|
new_vbuffer(GstVaapiVideoMeta *meta)
|
2010-04-29 21:56:10 +00:00
|
|
|
{
|
2010-05-11 16:19:30 +00:00
|
|
|
GstBuffer *buffer;
|
|
|
|
|
2013-01-05 16:37:13 +00:00
|
|
|
g_return_val_if_fail(meta != NULL, NULL);
|
2010-05-11 16:19:30 +00:00
|
|
|
|
2013-03-21 16:17:53 +00:00
|
|
|
gst_vaapi_video_meta_set_surface_converter(meta,
|
|
|
|
get_surface_converter(gst_vaapi_video_meta_get_display(meta)));
|
2010-05-11 16:19:30 +00:00
|
|
|
|
2013-03-21 16:17:53 +00:00
|
|
|
buffer = GST_BUFFER_CAST(gst_mini_object_new(GST_TYPE_SURFACE_BUFFER));
|
|
|
|
if (buffer)
|
|
|
|
gst_buffer_set_vaapi_video_meta(buffer, meta);
|
|
|
|
gst_vaapi_video_meta_unref(meta);
|
2010-05-11 16:19:30 +00:00
|
|
|
return buffer;
|
2010-03-12 23:48:50 +00:00
|
|
|
}
|
|
|
|
|
2013-03-21 16:17:53 +00:00
|
|
|
GstBuffer *
|
|
|
|
gst_vaapi_video_buffer_new_from_pool(GstVaapiVideoPool *pool)
|
|
|
|
{
|
|
|
|
return new_vbuffer(gst_vaapi_video_meta_new_from_pool(pool));
|
|
|
|
}
|
|
|
|
|
|
|
|
GstBuffer *
|
|
|
|
gst_vaapi_video_buffer_new_from_buffer(GstBuffer *buffer)
|
|
|
|
{
|
|
|
|
GstVaapiVideoMeta * const meta = gst_buffer_get_vaapi_video_meta(buffer);
|
|
|
|
|
|
|
|
return meta ? new_vbuffer(gst_vaapi_video_meta_ref(meta)) : NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
GstBuffer *
|
|
|
|
gst_vaapi_video_buffer_new_with_image(GstVaapiImage *image)
|
|
|
|
{
|
|
|
|
return new_vbuffer(gst_vaapi_video_meta_new_with_image(image));
|
|
|
|
}
|
|
|
|
|
|
|
|
GstBuffer *
|
|
|
|
gst_vaapi_video_buffer_new_with_surface(GstVaapiSurface *surface)
|
|
|
|
{
|
|
|
|
return new_vbuffer(gst_vaapi_video_meta_new_with_surface(surface));
|
|
|
|
}
|
|
|
|
|
|
|
|
GstBuffer *
|
|
|
|
gst_vaapi_video_buffer_new_with_surface_proxy(GstVaapiSurfaceProxy *proxy)
|
|
|
|
{
|
|
|
|
return new_vbuffer(gst_vaapi_video_meta_new_with_surface_proxy(proxy));
|
|
|
|
}
|
|
|
|
|
2013-01-05 16:37:13 +00:00
|
|
|
GstVaapiVideoMeta *
|
|
|
|
gst_vaapi_video_buffer_get_meta(GstVaapiVideoBuffer *buffer)
|
2010-03-12 23:48:50 +00:00
|
|
|
{
|
|
|
|
g_return_val_if_fail(GST_VAAPI_IS_VIDEO_BUFFER(buffer), NULL);
|
|
|
|
|
2013-01-05 16:37:13 +00:00
|
|
|
return buffer->meta;
|
2012-03-26 10:01:36 +00:00
|
|
|
}
|