mpeg2dec: Fix negotiation issue with playbin
[glsdk/gst-plugin-ducati.git] / src / gstducatibufferpriv.c
index 855b447764ccdc1a20b2bda4b413b8ed77824dba..1db1b6f08233db4a003c6478c8fbedce6b0d1def 100644 (file)
 
 #include "gstducatibufferpriv.h"
 
-#define GST_DUCATI_BUFFER_PRIV_QUARK gst_ducati_buffer_priv_quark_get_type()
-static GST_BOILERPLATE_QUARK (GstDucatiBufferPriv,
-    gst_ducati_buffer_priv_quark);
+static GType gst_meta_ducati_buffer_priv_api_get_type (void);
+#define GST_META_DUCATI_BUFFER_PRIV_API_TYPE (gst_meta_ducati_buffer_priv_api_get_type())
 
-#define DUCATI_BUFFER_PRIV_QUARK ducati_buffer_priv_quark_get_type()
-static GST_BOILERPLATE_QUARK (DucatiBufferPriv, ducati_buffer_priv_quark);
+static const GstMetaInfo *gst_meta_ducati_buffer_priv_get_info (void);
+#define GST_META_DUCATI_BUFFER_PRIV_INFO (gst_meta_ducati_buffer_priv_get_info())
 
-void
-gst_ducati_buffer_priv_set (GstBuffer * buf, GstDucatiBufferPriv * priv)
+#define GST_META_DUCATI_BUFFER_PRIV_GET(buf) ((GstMetaDucatiBufferPriv *)gst_buffer_get_meta(buf,GST_META_DUCATI_BUFFER_PRIV_API_TYPE))
+#define GST_META_DUCATI_BUFFER_PRIV_ADD(buf) ((GstMetaDucatiBufferPriv *)gst_buffer_add_meta(buf,GST_META_DUCATI_BUFFER_PRIV_INFO,NULL))
+
+
+static gboolean
+ducatibufferpriv_init_func (GstMeta * meta, gpointer params, GstBuffer * buffer)
 {
-  gst_buffer_set_qdata (buf, GST_DUCATI_BUFFER_PRIV_QUARK,
-      gst_structure_id_new (GST_DUCATI_BUFFER_PRIV_QUARK,
-          DUCATI_BUFFER_PRIV_QUARK, GST_TYPE_DUCATI_BUFFER_PRIV, priv, NULL));
+  GST_DEBUG ("init called on buffer %p, meta %p", buffer, meta);
+  /* nothing to init really, the init function is mostly for allocating
+   * additional memory or doing special setup as part of adding the metadata to
+   * the buffer*/
+  return TRUE;
 }
 
-GstDucatiBufferPriv *
-gst_ducati_buffer_priv_get (GstBuffer * buf)
+static void
+ducatibufferpriv_free_func (GstMeta * meta, GstBuffer * buffer)
 {
-  const GstStructure *s;
-  const GValue *val;
-
-  s = gst_buffer_get_qdata (buf, GST_DUCATI_BUFFER_PRIV_QUARK);
-  if (s == NULL)
-    return NULL;
-
-  val = gst_structure_id_get_value (s, DUCATI_BUFFER_PRIV_QUARK);
-  if (val == NULL)
-    return NULL;
+  GstMetaDucatiBufferPriv *priv = (GstMetaDucatiBufferPriv *) meta;
+  /* Release the memory associated with priv */
+  omap_bo_del (priv->bo);
+}
 
-  return GST_DUCATI_BUFFER_PRIV (gst_value_get_mini_object (val));
+static gboolean
+ducatibufferpriv_transform_func (GstBuffer * transbuf, GstMeta * meta,
+    GstBuffer * buffer, GQuark type, gpointer data)
+{
+  /* Nothing to be done. Returning FALSE signifies that it is not an allowed operation */
+  return FALSE;
 }
 
-GstDucatiBufferPriv *
-gst_ducati_buffer_priv_new (void)
+static GType
+gst_meta_ducati_buffer_priv_api_get_type (void)
 {
-  return (GstDucatiBufferPriv *)
-      gst_mini_object_new (GST_TYPE_DUCATI_BUFFER_PRIV);
+  static volatile GType type;
+  static const gchar *tags[] = { "ducatibufferpriv", NULL };
+
+  if (g_once_init_enter (&type)) {
+    GType _type =
+        gst_meta_api_type_register ("GstMetaDucatiBufferPrivAPI", tags);
+    g_once_init_leave (&type, _type);
+  }
+  return type;
 }
 
-static void
-gst_ducati_buffer_priv_finalize (GstMiniObject * mini_obj)
+static const GstMetaInfo *
+gst_meta_ducati_buffer_priv_get_info (void)
 {
-  GstDucatiBufferPriv *priv = (GstDucatiBufferPriv *) mini_obj;
+  static const GstMetaInfo *meta_ducati_buffer_priv_info = NULL;
+
+  if (g_once_init_enter (&meta_ducati_buffer_priv_info)) {
+    const GstMetaInfo *mi =
+        gst_meta_register (GST_META_DUCATI_BUFFER_PRIV_API_TYPE,
+        "GstMetaDucatiBufferPriv",
+        sizeof (GstMetaDucatiBufferPriv),
+        ducatibufferpriv_init_func, ducatibufferpriv_free_func,
+        ducatibufferpriv_transform_func);
+    g_once_init_leave (&meta_ducati_buffer_priv_info, mi);
+  }
+  return meta_ducati_buffer_priv_info;
+}
 
-  omap_bo_del (priv->bo);
+/**
+ * gst_ducati_buffer_priv_set:
+ * @buf: a #GstBuffer
+ * @bo: a omap_bo structure
+ * @uv_offset: the uv offset
+ * @size: the size
+ *
+ * Adds a GstMetaDucatiBufferPriv metadata to the buffer. The @bo, @uv_offset and @size are also set in the metadata added 
+ * 
+ * Returns: the #GstMetaDucatiBufferPriv set on the @buf
+ *
+ * Since: 1.2.?
+ */
 
-  /* not chaining up to GstMiniObject's finalize for now, we know it's empty */
+GstMetaDucatiBufferPriv *
+gst_ducati_buffer_priv_set (GstBuffer * buf, struct omap_bo * bo,
+    gint uv_offset, gint size)
+{
+  GstMetaDucatiBufferPriv *priv;
+  priv = GST_META_DUCATI_BUFFER_PRIV_ADD (buf);
+  if (priv) {
+    priv->bo = bo;
+    priv->uv_offset = uv_offset;
+    priv->size = size;
+  }
+  return priv;
 }
 
-GST_BOILERPLATE_MINI_OBJECT (GstDucatiBufferPriv, gst_ducati_buffer_priv);
-
-static void
-gst_ducati_buffer_priv_class_init (GstDucatiBufferPrivClass * klass)
+/**
+ * gst_ducati_buffer_priv_get:
+ * @buf: a #GstBuffer
+ *
+ * Get the GstMetaDucatiBufferPriv metadata that has previously been attached to a buffer
+ * with gst_ducati_buffer_priv_set(), usually by another element
+ * upstream.
+ * 
+ * Returns: the #GstMetaDucatiBufferPriv previously set on @buf
+ *
+ * Since: 1.2.?
+ */
+GstMetaDucatiBufferPriv *
+gst_ducati_buffer_priv_get (GstBuffer * buf)
 {
-  GST_MINI_OBJECT_CLASS (klass)->finalize = gst_ducati_buffer_priv_finalize;
+  GstMetaDucatiBufferPriv *priv;
+  priv = GST_META_DUCATI_BUFFER_PRIV_GET (buf);
+  return priv;
 }