Use buffer qdata for the private info of Ducati instead of GstMeta
[gstreamer-omap:gst-ducati.git] / src / gstducatipriv.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 <omap_drm.h>
34 #include <omap_drmif.h>
35 #include <xf86drmMode.h>
36
37 #include "gstducatipriv.h"
38 #include <sys/dma/gstdmabufmeta.h>
39
40 #define PRIV_QUARK_STR "GstDucatiPriv"
41
42
43 GType _gst_ducati_priv_type;
44 GST_DEFINE_MINI_OBJECT_TYPE (GstDucatiPriv, gst_ducati_priv);
45
46 static inline GstDucatiPriv *
47 gst_buffer_get_ducati_priv (GstBuffer * buf)
48 {
49   return GST_DUCATI_PRIV (gst_mini_object_get_qdata (GST_MINI_OBJECT (buf),
50           g_quark_from_string (PRIV_QUARK_STR)));
51 }
52
53 static void
54 gst_ducati_priv_finalize (GstDucatiPriv * priv)
55 {
56   omap_bo_del (priv->bo);
57 }
58
59 static GstDucatiPriv *
60 gst_ducati_priv_new (void)
61 {
62   GstDucatiPriv *priv = g_slice_new0 (GstDucatiPriv);
63
64   gst_mini_object_init (GST_MINI_OBJECT_CAST (priv),
65       0, _gst_ducati_priv_type, NULL, NULL,
66       (GstMiniObjectFreeFunction) gst_ducati_priv_finalize);
67
68   return priv;
69 }
70
71 GstDucatiPriv *
72 gst_buffer_add_ducati_priv (GstBuffer * buffer,
73     struct omap_device * device, GstVideoInfo * info)
74 {
75   GstDmaBufMeta *dmabufmeta = NULL;
76   GstDucatiPriv *priv = gst_buffer_get_ducati_priv (buffer);
77
78   if (!priv) {
79     struct omap_bo *bo;
80
81     dmabufmeta = gst_buffer_get_dma_buf_meta (buffer);
82     if (!dmabufmeta)
83       goto not_dmabuf;
84
85     if (!(bo = omap_bo_from_dmabuf (device, dmabufmeta->fd)))
86       goto create_bo_failed;
87
88     priv = gst_ducati_priv_new ();
89     gst_mini_object_set_qdata (GST_MINI_OBJECT (buffer),
90         g_quark_from_string (PRIV_QUARK_STR), priv,
91         (GDestroyNotify) gst_mini_object_unref);
92     priv->bo = bo;
93     priv->uv_offset = info->offset[1];
94     priv->size = info->size;
95   }
96
97   return priv;
98
99 not_dmabuf:
100   GST_WARNING ("Can't do anything without dmabuf meta");
101   return NULL;
102
103 create_bo_failed:
104   GST_WARNING ("Can't create omap bo");
105   return NULL;
106 }