mpeg2dec: Fix negotiation issue with playbin
[glsdk/gst-plugin-ducati.git] / src / gstducatibufferpriv.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  */
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
30 #include <stdint.h>
31 #include <gst/gst.h>
33 #include <omap_drm.h>
34 #include <omap_drmif.h>
35 #include <xf86drmMode.h>
37 #include "gstducatibufferpriv.h"
39 static GType gst_meta_ducati_buffer_priv_api_get_type (void);
40 #define GST_META_DUCATI_BUFFER_PRIV_API_TYPE (gst_meta_ducati_buffer_priv_api_get_type())
42 static const GstMetaInfo *gst_meta_ducati_buffer_priv_get_info (void);
43 #define GST_META_DUCATI_BUFFER_PRIV_INFO (gst_meta_ducati_buffer_priv_get_info())
45 #define GST_META_DUCATI_BUFFER_PRIV_GET(buf) ((GstMetaDucatiBufferPriv *)gst_buffer_get_meta(buf,GST_META_DUCATI_BUFFER_PRIV_API_TYPE))
46 #define GST_META_DUCATI_BUFFER_PRIV_ADD(buf) ((GstMetaDucatiBufferPriv *)gst_buffer_add_meta(buf,GST_META_DUCATI_BUFFER_PRIV_INFO,NULL))
49 static gboolean
50 ducatibufferpriv_init_func (GstMeta * meta, gpointer params, GstBuffer * buffer)
51 {
52   GST_DEBUG ("init called on buffer %p, meta %p", buffer, meta);
53   /* nothing to init really, the init function is mostly for allocating
54    * additional memory or doing special setup as part of adding the metadata to
55    * the buffer*/
56   return TRUE;
57 }
59 static void
60 ducatibufferpriv_free_func (GstMeta * meta, GstBuffer * buffer)
61 {
62   GstMetaDucatiBufferPriv *priv = (GstMetaDucatiBufferPriv *) meta;
63   /* Release the memory associated with priv */
64   omap_bo_del (priv->bo);
65 }
67 static gboolean
68 ducatibufferpriv_transform_func (GstBuffer * transbuf, GstMeta * meta,
69     GstBuffer * buffer, GQuark type, gpointer data)
70 {
71   /* Nothing to be done. Returning FALSE signifies that it is not an allowed operation */
72   return FALSE;
73 }
75 static GType
76 gst_meta_ducati_buffer_priv_api_get_type (void)
77 {
78   static volatile GType type;
79   static const gchar *tags[] = { "ducatibufferpriv", NULL };
81   if (g_once_init_enter (&type)) {
82     GType _type =
83         gst_meta_api_type_register ("GstMetaDucatiBufferPrivAPI", tags);
84     g_once_init_leave (&type, _type);
85   }
86   return type;
87 }
89 static const GstMetaInfo *
90 gst_meta_ducati_buffer_priv_get_info (void)
91 {
92   static const GstMetaInfo *meta_ducati_buffer_priv_info = NULL;
94   if (g_once_init_enter (&meta_ducati_buffer_priv_info)) {
95     const GstMetaInfo *mi =
96         gst_meta_register (GST_META_DUCATI_BUFFER_PRIV_API_TYPE,
97         "GstMetaDucatiBufferPriv",
98         sizeof (GstMetaDucatiBufferPriv),
99         ducatibufferpriv_init_func, ducatibufferpriv_free_func,
100         ducatibufferpriv_transform_func);
101     g_once_init_leave (&meta_ducati_buffer_priv_info, mi);
102   }
103   return meta_ducati_buffer_priv_info;
106 /**
107  * gst_ducati_buffer_priv_set:
108  * @buf: a #GstBuffer
109  * @bo: a omap_bo structure
110  * @uv_offset: the uv offset
111  * @size: the size
112  *
113  * Adds a GstMetaDucatiBufferPriv metadata to the buffer. The @bo, @uv_offset and @size are also set in the metadata added 
114  * 
115  * Returns: the #GstMetaDucatiBufferPriv set on the @buf
116  *
117  * Since: 1.2.?
118  */
120 GstMetaDucatiBufferPriv *
121 gst_ducati_buffer_priv_set (GstBuffer * buf, struct omap_bo * bo,
122     gint uv_offset, gint size)
124   GstMetaDucatiBufferPriv *priv;
125   priv = GST_META_DUCATI_BUFFER_PRIV_ADD (buf);
126   if (priv) {
127     priv->bo = bo;
128     priv->uv_offset = uv_offset;
129     priv->size = size;
130   }
131   return priv;
134 /**
135  * gst_ducati_buffer_priv_get:
136  * @buf: a #GstBuffer
137  *
138  * Get the GstMetaDucatiBufferPriv metadata that has previously been attached to a buffer
139  * with gst_ducati_buffer_priv_set(), usually by another element
140  * upstream.
141  * 
142  * Returns: the #GstMetaDucatiBufferPriv previously set on @buf
143  *
144  * Since: 1.2.?
145  */
146 GstMetaDucatiBufferPriv *
147 gst_ducati_buffer_priv_get (GstBuffer * buf)
149   GstMetaDucatiBufferPriv *priv;
150   priv = GST_META_DUCATI_BUFFER_PRIV_GET (buf);
151   return priv;