From c4653948645a63accf0db0bcb3c3c554d36c5838 Mon Sep 17 00:00:00 2001 From: gb Date: Fri, 12 Mar 2010 23:48:50 +0000 Subject: [PATCH] Add basic GstVaapiVideoBuffer. --- gst-libs/gst/vaapi/Makefile.am | 2 + gst-libs/gst/vaapi/gstvaapivideobuffer.c | 188 +++++++++++++++++++++++++++++++ gst-libs/gst/vaapi/gstvaapivideobuffer.h | 91 +++++++++++++++ 3 files changed, 281 insertions(+) create mode 100644 gst-libs/gst/vaapi/gstvaapivideobuffer.c create mode 100644 gst-libs/gst/vaapi/gstvaapivideobuffer.h diff --git a/gst-libs/gst/vaapi/Makefile.am b/gst-libs/gst/vaapi/Makefile.am index d6333d1..f9171c1 100644 --- a/gst-libs/gst/vaapi/Makefile.am +++ b/gst-libs/gst/vaapi/Makefile.am @@ -9,6 +9,7 @@ libgstvaapi_source_c = \ gstvaapisubpicture.c \ gstvaapisurface.c \ gstvaapisurfacepool.c \ + gstvaapivideobuffer.c \ gstvaapivideopool.c \ vaapi_utils.c \ $(NULL) @@ -22,6 +23,7 @@ libgstvaapi_source_h = \ gstvaapisubpicture.h \ gstvaapisurface.h \ gstvaapisurfacepool.h \ + gstvaapivideobuffer.h \ gstvaapivideopool.h \ vaapi_debug.h \ vaapi_utils.h \ diff --git a/gst-libs/gst/vaapi/gstvaapivideobuffer.c b/gst-libs/gst/vaapi/gstvaapivideobuffer.c new file mode 100644 index 0000000..1daeb1e --- /dev/null +++ b/gst-libs/gst/vaapi/gstvaapivideobuffer.c @@ -0,0 +1,188 @@ +/* + * gstvaapivideobuffer.c - Gst VA video buffer + * + * gstreamer-vaapi (C) 2010 Splitted-Desktop Systems + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "gstvaapivideobuffer.h" + +#define DEBUG 1 +#include "vaapi_debug.h" + +G_DEFINE_TYPE(GstVaapiVideoBuffer, gst_vaapi_video_buffer, GST_TYPE_BUFFER); + +#define GST_VAAPI_VIDEO_BUFFER_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), \ + GST_VAAPI_TYPE_VIDEO_BUFFER, \ + GstVaapiVideoBufferPrivate)) + +struct _GstVaapiVideoBufferPrivate { + GstVaapiVideoPool *pool; + guint pool_type; + GstVaapiImage *image; + GstVaapiSurface *surface; + guint flags; +}; + +enum { + POOL_TYPE_NONE, + POOL_TYPE_IMAGE, + POOL_TYPE_SURFACE +}; + +static void +gst_vaapi_video_buffer_finalize(GstMiniObject *object) +{ + GstVaapiVideoBufferPrivate *priv = GST_VAAPI_VIDEO_BUFFER(object)->priv; + GstMiniObjectClass *parent_class; + + if (priv->image) { + if (priv->pool_type == POOL_TYPE_IMAGE) + gst_vaapi_video_pool_put_object(priv->pool, priv->image); + else + g_object_unref(priv->image); + priv->image = NULL; + } + + if (priv->surface) { + if (priv->pool_type == POOL_TYPE_SURFACE) + gst_vaapi_video_pool_put_object(priv->pool, priv->surface); + else + g_object_unref(priv->surface); + priv->surface = NULL; + } + + if (priv->pool) { + g_object_unref(priv->pool); + priv->pool = NULL; + } + + parent_class = GST_MINI_OBJECT_CLASS(gst_vaapi_video_buffer_parent_class); + if (parent_class->finalize) + parent_class->finalize(object); +} + +static void +gst_vaapi_video_buffer_class_init(GstVaapiVideoBufferClass *klass) +{ + GstMiniObjectClass * const object_class = GST_MINI_OBJECT_CLASS(klass); + + g_type_class_add_private(klass, sizeof(GstVaapiVideoBufferPrivate)); + + object_class->finalize = gst_vaapi_video_buffer_finalize; +} + +static void +gst_vaapi_video_buffer_init(GstVaapiVideoBuffer *buffer) +{ + GstVaapiVideoBufferPrivate *priv; + + priv = GST_VAAPI_VIDEO_BUFFER_GET_PRIVATE(buffer); + buffer->priv = priv; + priv->pool = NULL; + priv->image = NULL; + priv->surface = NULL; +} + +static GstBuffer * +gst_vaapi_video_buffer_new( + GstVaapiVideoPool *pool, + GstVaapiImage *image, + GstVaapiSurface *surface +) +{ + gpointer vobject = NULL; + GstMiniObject *object; + GstVaapiVideoBuffer *buffer; + GstVaapiVideoBufferPrivate *priv; + + object = gst_mini_object_new(GST_VAAPI_TYPE_VIDEO_BUFFER); + if (!object) + return NULL; + + buffer = GST_VAAPI_VIDEO_BUFFER(object); + priv = buffer->priv; + priv->pool = pool; + priv->pool_type = POOL_TYPE_NONE; + priv->image = image; + priv->surface = surface; + + if (pool) { + vobject = gst_vaapi_video_pool_get_object(pool); + if (!vobject) + goto error; + + if (GST_VAAPI_IS_IMAGE(vobject)) { + priv->pool_type = POOL_TYPE_IMAGE; + priv->image = vobject; + } + else if (GST_VAAPI_IS_SURFACE(vobject)) { + priv->pool_type = POOL_TYPE_SURFACE; + priv->surface = vobject; + } + else + goto error; + } + return GST_BUFFER(buffer); + +error: + if (vobject) + gst_vaapi_video_pool_put_object(pool, vobject); + gst_mini_object_unref(object); + return NULL; +} + +GstBuffer * +gst_vaapi_video_buffer_new_from_pool(GstVaapiVideoPool *pool) +{ + g_return_val_if_fail(GST_VAAPI_IS_VIDEO_POOL(pool), NULL); + + return gst_vaapi_video_buffer_new(g_object_ref(pool), NULL, NULL); +} + +GstBuffer * +gst_vaapi_video_buffer_new_with_image(GstVaapiImage *image) +{ + g_return_val_if_fail(GST_VAAPI_IS_IMAGE(image), NULL); + + return gst_vaapi_video_buffer_new(NULL, g_object_ref(image), NULL); +} + +GstBuffer * +gst_vaapi_video_buffer_new_with_surface(GstVaapiSurface *surface) +{ + g_return_val_if_fail(GST_VAAPI_IS_SURFACE(surface), NULL); + + return gst_vaapi_video_buffer_new(NULL, NULL, g_object_ref(surface)); +} + +GstVaapiImage * +gst_vaapi_video_buffer_get_image(GstVaapiVideoBuffer *buffer) +{ + g_return_val_if_fail(GST_VAAPI_IS_VIDEO_BUFFER(buffer), NULL); + + return buffer->priv->image; +} + +GstVaapiSurface * +gst_vaapi_video_buffer_get_surface(GstVaapiVideoBuffer *buffer) +{ + g_return_val_if_fail(GST_VAAPI_IS_VIDEO_BUFFER(buffer), NULL); + + return buffer->priv->surface; +} diff --git a/gst-libs/gst/vaapi/gstvaapivideobuffer.h b/gst-libs/gst/vaapi/gstvaapivideobuffer.h new file mode 100644 index 0000000..5cecfec --- /dev/null +++ b/gst-libs/gst/vaapi/gstvaapivideobuffer.h @@ -0,0 +1,91 @@ +/* + * gstvaapivideobuffer.h - Gstreamer/VA video buffer + * + * gstreamer-vaapi (C) 2010 Splitted-Desktop Systems + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef GST_VAAPI_VIDEO_BUFFER_H +#define GST_VAAPI_VIDEO_BUFFER_H + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#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 _GstVaapiVideoBuffer GstVaapiVideoBuffer; +typedef struct _GstVaapiVideoBufferPrivate GstVaapiVideoBufferPrivate; +typedef struct _GstVaapiVideoBufferClass GstVaapiVideoBufferClass; + +struct _GstVaapiVideoBuffer { + /*< private >*/ + GstBuffer parent_instance; + + GstVaapiVideoBufferPrivate *priv; +}; + +struct _GstVaapiVideoBufferClass { + /*< private >*/ + GstBufferClass parent_class; +}; + +GType +gst_vaapi_video_buffer_get_type(void); + +GstBuffer * +gst_vaapi_video_buffer_new_from_pool(GstVaapiVideoPool *pool); + +GstBuffer * +gst_vaapi_video_buffer_new_with_image(GstVaapiImage *image); + +GstBuffer * +gst_vaapi_video_buffer_new_with_surface(GstVaapiSurface *surface); + +GstVaapiImage * +gst_vaapi_video_buffer_get_image(GstVaapiVideoBuffer *buffer); + +GstVaapiSurface * +gst_vaapi_video_buffer_get_surface(GstVaapiVideoBuffer *buffer); + +G_END_DECLS + +#endif /* GST_VAAPI_VIDEO_BUFFER_H */ -- 2.7.4