diff options
Diffstat (limited to 'sys/vdpau/gstvdp/gstvdpvideobufferpool.c')
-rw-r--r-- | sys/vdpau/gstvdp/gstvdpvideobufferpool.c | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/sys/vdpau/gstvdp/gstvdpvideobufferpool.c b/sys/vdpau/gstvdp/gstvdpvideobufferpool.c new file mode 100644 index 000000000..889367d98 --- /dev/null +++ b/sys/vdpau/gstvdp/gstvdpvideobufferpool.c @@ -0,0 +1,146 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * gst-plugins-bad + * Copyright (C) Carl-Anton Ingmarsson 2010 <ca.ingmarsson@gmail.com> + * + * gst-plugins-bad 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 3 of the License, or + * (at your option) any later version. + * + * gst-plugins-bad 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, see <http://www.gnu.org/licenses/>. + */ + +#include "gstvdpdevice.h" +#include "gstvdpvideobuffer.h" + +#include "gstvdpvideobufferpool.h" + + +struct _GstVdpVideoBufferPool +{ + GstVdpBufferPool buffer_pool; + + VdpChromaType chroma_type; + guint width, height; +}; + +G_DEFINE_TYPE (GstVdpVideoBufferPool, gst_vdp_video_buffer_pool, + GST_TYPE_VDP_BUFFER_POOL); + +GstVdpBufferPool * +gst_vdp_video_buffer_pool_new (GstVdpDevice * device) +{ + g_return_val_if_fail (GST_IS_VDP_DEVICE (device), NULL); + + return g_object_new (GST_TYPE_VDP_VIDEO_BUFFER_POOL, "device", device, NULL); +} + +static gboolean +parse_caps (const GstCaps * caps, VdpChromaType * chroma_type, gint * width, + gint * height) +{ + GstStructure *structure; + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "chroma-type", (gint *) chroma_type)) + return FALSE; + if (!gst_structure_get_int (structure, "width", width)) + return FALSE; + if (!gst_structure_get_int (structure, "height", height)) + return FALSE; + + return TRUE; +} + +static gboolean +gst_vdp_video_buffer_pool_check_caps (GstVdpBufferPool * bpool, + const GstCaps * caps) +{ + GstVdpVideoBufferPool *vpool = GST_VDP_VIDEO_BUFFER_POOL (bpool); + + VdpChromaType chroma_type; + gint width, height; + + if (!parse_caps (caps, &chroma_type, &width, &height)) + return FALSE; + + if (chroma_type != vpool->chroma_type || width != vpool->width || + height != vpool->height) + return FALSE; + + return TRUE; +} + +static gboolean +gst_vdp_video_buffer_pool_set_caps (GstVdpBufferPool * bpool, + const GstCaps * caps, gboolean * clear_bufs) +{ + GstVdpVideoBufferPool *vpool = GST_VDP_VIDEO_BUFFER_POOL (bpool); + + VdpChromaType chroma_type; + gint width, height; + + if (!parse_caps (caps, &chroma_type, &width, &height)) + return FALSE; + + if (chroma_type != vpool->chroma_type || width != vpool->width || + height != vpool->height) + *clear_bufs = TRUE; + else + *clear_bufs = FALSE; + + vpool->chroma_type = chroma_type; + vpool->width = width; + vpool->height = height; + + return TRUE; +} + +static GstVdpBuffer * +gst_vdp_video_buffer_pool_alloc_buffer (GstVdpBufferPool * bpool, + GError ** error) +{ + GstVdpVideoBufferPool *vpool = GST_VDP_VIDEO_BUFFER_POOL (bpool); + GstVdpDevice *device; + + device = gst_vdp_buffer_pool_get_device (bpool); + return GST_VDP_BUFFER_CAST (gst_vdp_video_buffer_new (device, + vpool->chroma_type, vpool->width, vpool->height, error)); +} + +static void +gst_vdp_video_buffer_pool_finalize (GObject * object) +{ + /* TODO: Add deinitalization code here */ + + G_OBJECT_CLASS (gst_vdp_video_buffer_pool_parent_class)->finalize (object); +} + +static void +gst_vdp_video_buffer_pool_init (GstVdpVideoBufferPool * vpool) +{ + vpool->chroma_type = -1; + vpool->width = 0; + vpool->height = 0; +} + +static void +gst_vdp_video_buffer_pool_class_init (GstVdpVideoBufferPoolClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstVdpBufferPoolClass *buffer_pool_class = GST_VDP_BUFFER_POOL_CLASS (klass); + + buffer_pool_class->alloc_buffer = gst_vdp_video_buffer_pool_alloc_buffer; + buffer_pool_class->set_caps = gst_vdp_video_buffer_pool_set_caps; + buffer_pool_class->check_caps = gst_vdp_video_buffer_pool_check_caps; + + object_class->finalize = gst_vdp_video_buffer_pool_finalize; +} |