Port DucatiVidDec to the Gstreamer 1.0 API
[gstreamer-omap:gst-ducati.git] / src / gstducatimeta.c
1 /*
2  * GStreamer
3  *
4  * Copyright (C) 2012 Texas Instruments
5  * Copyright (C) 2012 Collabora Ltd
6  *
7  * Authors:
8  *  Alessandro Decina <alessandro.decina@collabora.co.uk>
9  *  Rob Clark <rob.clark@linaro.org>
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation
14  * version 2.1 of the License.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with this library; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
24  */
25
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
29
30 #include <stdint.h>
31 #include <gst/gst.h>
32
33 #include <xf86drmMode.h>
34
35 #include "gstducatimeta.h"
36 #include <sys/dma/gstdmabufmeta.h>
37
38 static void
39 gst_ducati_priv_meta_free (GstMeta * meta, GstBuffer * buffer)
40 {
41   GstDucatiPrivMeta *smeta = (GstDucatiPrivMeta *) meta;
42
43   /* FIXME : Shouldn't we check if the bo is valid ? */
44   omap_bo_del (smeta->bo);
45 }
46
47 /**
48  * gst_buffer_add_ducati_priv_meta:
49  * @buffer: a #GstBuffer
50  *
51  * Returns: the #GstDucatiPrivMeta on @buffer.
52  */
53 GstDucatiPrivMeta *
54 gst_buffer_add_ducati_priv_meta (GstBuffer * buffer,
55     struct omap_device *device, GstVideoInfo * info)
56 {
57   GstDucatiPrivMeta *privmeta = gst_buffer_get_ducati_priv_meta (buffer);
58
59   if (!privmeta) {
60     GstDmaBufMeta *dmabufmeta = gst_buffer_get_dma_buf_meta (buffer);
61
62     /* if it isn't a dmabuf buffer that we can import, then there
63      * is nothing we can do with it */
64     if (!dmabufmeta)
65       goto not_dmabuf;
66
67     privmeta = (GstDucatiPrivMeta *) gst_buffer_add_meta (buffer,
68         GST_DUCATI_PRIV_META_INFO, NULL);
69
70     if (privmeta == NULL)
71       goto add_meta_failed;
72
73     privmeta->bo = omap_bo_from_dmabuf (device, dmabufmeta->fd);
74     privmeta->uv_offset = info->offset[1];
75     privmeta->size = info->size;
76   }
77
78   return privmeta;
79
80   /* Error cases */
81
82 not_dmabuf:
83   GST_WARNING ("Can't do anything without dmabuf meta");
84   return NULL;
85
86 add_meta_failed:
87   GST_WARNING ("Could not add DucatiPrivMeta to the buffer");
88   return NULL;
89 }
90
91 GType
92 gst_ducati_priv_meta_api_get_type (void)
93 {
94   static volatile GType type;
95   static const gchar *tags[] = { NULL };
96
97   if (g_once_init_enter (&type)) {
98     GType _type = gst_meta_api_type_register ("GstDucatiPrivMetaAPI", tags);
99     g_once_init_leave (&type, _type);
100   }
101   return type;
102 }
103
104 const GstMetaInfo *
105 gst_ducati_priv_meta_get_info (void)
106 {
107   static const GstMetaInfo *ducati_priv_meta_info = NULL;
108
109   if (ducati_priv_meta_info == NULL) {
110     ducati_priv_meta_info = gst_meta_register (GST_DUCATI_PRIV_META_API_TYPE, "GstDucatiPrivMeta", sizeof (GstDucatiPrivMeta), NULL,    /* No init needed */
111         gst_ducati_priv_meta_free, NULL /* FIXME : No transform needed ? */ );
112   }
113   return ducati_priv_meta_info;
114 }