pvrvideosink: get rid of the dependency on dri2_omap_ws.h
[gstreamer-omap:gst-plugins-bad.git] / sys / pvr2d / gstpvrbufferpriv.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 #include <gst/dmabuf/dmabuf.h>
33
34 #include "gstpvrvideosink.h"
35 #include "gstpvrbufferpriv.h"
36
37 #define GST_PVR_BUFFER_PRIV_QUARK gst_pvr_buffer_priv_quark_get_type()
38 static GST_BOILERPLATE_QUARK (GstPVRBufferPriv, gst_pvr_buffer_priv_quark);
39
40 #define PVR_BUFFER_PRIV_QUARK pvr_buffer_priv_quark_get_type()
41 static GST_BOILERPLATE_QUARK (PVRBufferPriv, pvr_buffer_priv_quark);
42
43 static void
44 set_pvr_buffer_priv (GstBuffer * buf, GstPVRBufferPriv * priv)
45 {
46   gst_buffer_set_qdata (buf, GST_PVR_BUFFER_PRIV_QUARK,
47       gst_structure_id_new (GST_PVR_BUFFER_PRIV_QUARK,
48           PVR_BUFFER_PRIV_QUARK, GST_TYPE_PVR_BUFFER_PRIV, priv, NULL));
49 }
50
51 static GstPVRBufferPriv *
52 get_pvr_buffer_priv (GstBuffer * buf)
53 {
54   const GstStructure *s;
55   const GValue *val;
56
57   s = gst_buffer_get_qdata (buf, GST_PVR_BUFFER_PRIV_QUARK);
58   if (s == NULL)
59     return NULL;
60
61   val = gst_structure_id_get_value (s, PVR_BUFFER_PRIV_QUARK);
62   if (val == NULL)
63     return NULL;
64
65   return GST_PVR_BUFFER_PRIV (gst_value_get_mini_object (val));
66 }
67
68 static void
69 gst_pvr_buffer_priv_finalize (GstMiniObject * mini_obj)
70 {
71   GstPVRBufferPriv *priv = (GstPVRBufferPriv *) mini_obj;
72
73   PVR2DMemFree (priv->context, priv->mem_info);
74   gst_display_handle_unref (priv->display_handle);
75 }
76
77 static void
78 gst_pvr_buffer_priv_class_init (GstPVRBufferPrivClass * klass)
79 {
80   GST_MINI_OBJECT_CLASS (klass)->finalize = gst_pvr_buffer_priv_finalize;
81 }
82
83 GST_BOILERPLATE_MINI_OBJECT (GstPVRBufferPriv, gst_pvr_buffer_priv);
84
85 GstPVRBufferPriv *
86 gst_pvr_buffer_priv (GstPVRVideoSink * sink, GstBuffer * buf)
87 {
88   GstPVRBufferPriv *priv = get_pvr_buffer_priv (buf);
89   if (!priv) {
90     GstDmaBuf *dmabuf = gst_buffer_get_dma_buf (buf);
91
92     /* if it isn't a dmabuf buffer that we can import, then there
93      * is nothing we can do with it:
94      */
95     if (!dmabuf) {
96       GST_DEBUG_OBJECT (sink, "not importing non dmabuf buffer");
97       return NULL;
98     }
99
100     priv = (GstPVRBufferPriv *) gst_mini_object_new (GST_TYPE_PVR_BUFFER_PRIV);
101
102     priv->display_handle =
103         gst_display_handle_ref (sink->dcontext->gst_display_handle);
104     priv->context = sink->dcontext->pvr_context;
105     if (PVR2DImportDmaBuf (priv->context, gst_dma_buf_get_fd (dmabuf),
106             &priv->mem_info)) {
107       GST_ERROR_OBJECT (sink, "could not import bo: %s", strerror (errno));
108       gst_mini_object_unref (GST_MINI_OBJECT_CAST (priv));
109       return NULL;
110     }
111
112     set_pvr_buffer_priv (buf, priv);
113
114     /* set_pvr_buffer_priv will ref priv via gst_structure_id_new */
115     gst_mini_object_unref (GST_MINI_OBJECT_CAST (priv));
116   }
117   return priv;
118 }