- Added value transform functions for caps and props boxed types
[platform/upstream/gstreamer.git] / gst / gstcaps.c
index 9d3be71..f7ed767 100644 (file)
 
 #include "gstcaps.h"
 #include "gsttype.h"
-
-#include "gstpropsprivate.h"
+#include "gstlog.h"
 
 static GMemChunk *_gst_caps_chunk;
 static GMutex *_gst_caps_chunk_lock;
 
+GType _gst_caps_type;
+
+static void
+transform_func (const GValue *src_value,
+               GValue *dest_value)
+{
+  GstCaps *caps = g_value_peek_pointer (src_value);
+  GString *result = g_string_new (""); 
+
+  g_string_append_printf (result, "(GstCaps *) ");
+                 
+  while (caps) {
+    gchar *props;
+    GValue value = { 0, }; /* the important thing is that value.type = 0 */
+    
+    g_string_append_printf (result,
+                 "{ %s; ", gst_caps_get_mime (caps));
+
+    g_value_init (&value, GST_TYPE_PROPS);
+    g_value_set_boxed  (&value, caps->properties);
+    props = g_strdup_value_contents (&value);
+
+    g_string_append (result, props);
+    g_free (props);
+
+    caps = caps->next;
+    g_string_append_printf (result, " }%s", caps?", ":"");
+  }
+  dest_value->data[0].v_pointer = result->str;
+}
+
 void
 _gst_caps_initialize (void)
 {
@@ -38,6 +68,14 @@ _gst_caps_initialize (void)
                   sizeof (GstCaps), sizeof (GstCaps) * 256,
                   G_ALLOC_AND_FREE);
   _gst_caps_chunk_lock = g_mutex_new ();
+
+  _gst_caps_type = g_boxed_type_register_static ("GstCaps",
+                                       (GBoxedCopyFunc) gst_caps_ref,
+                                       (GBoxedFreeFunc) gst_caps_unref);
+
+  g_value_register_transform_func (_gst_caps_type,
+                                  G_TYPE_STRING,
+                                  transform_func);
 }
 
 static guint16
@@ -55,7 +93,7 @@ get_type_for_mime (const gchar *mime)
      definition.exts = NULL;
      definition.typefindfunc = NULL;
 
-     factory = gst_typefactory_new (&definition);
+     factory = gst_type_factory_new (&definition);
 
      typeid = gst_type_register (factory);
   }
@@ -104,7 +142,6 @@ gst_caps_new_id (const gchar *name, const guint16 id, GstProps *props)
   caps->properties = props;
   caps->next = NULL;
   caps->refcount = 1;
-  caps->lock = g_mutex_new ();
   if (props)
     caps->fixed = props->fixed;
   else
@@ -127,12 +164,9 @@ gst_caps_destroy (GstCaps *caps)
 
   if (caps == NULL)
     return;
-  
-  GST_CAPS_LOCK (caps);
+
   next = caps->next;
-  GST_CAPS_UNLOCK (caps);
 
-  g_mutex_free (caps->lock);
   gst_props_unref (caps->properties);
   g_free (caps->name);
   g_mutex_lock (_gst_caps_chunk_lock);
@@ -143,18 +177,26 @@ gst_caps_destroy (GstCaps *caps)
     gst_caps_unref (next);
 }
 
+/**
+ * gst_caps_debug:
+ * @caps: the caps to print out
+ * @label: a label to put on the printout, or NULL
+ *
+ * Print out the contents of the caps structure. Useful for debugging.
+ */
 void
-gst_caps_debug (GstCaps *caps)
+gst_caps_debug (GstCaps *caps, const gchar *label)
 {
-  GST_DEBUG_ENTER ("caps debug");
+  GST_DEBUG_ENTER ("caps debug: %s", label);
   while (caps) {
-    GST_DEBUG (GST_CAT_CAPS, "caps: %p %s %s\n", caps, caps->name, gst_caps_get_mime (caps));
+    GST_DEBUG (GST_CAT_CAPS, "caps: %p %s %s (%sfixed)", caps, caps->name, gst_caps_get_mime (caps), 
+               caps->fixed ? "" : "NOT ");
 
     if (caps->properties) {
       gst_props_debug (caps->properties);
     }
     else {
-      GST_DEBUG (GST_CAT_CAPS, "no properties\n");
+      GST_DEBUG (GST_CAT_CAPS, "no properties");
     }
 
     caps = caps->next;
@@ -182,11 +224,9 @@ gst_caps_unref (GstCaps *caps)
 
   g_return_val_if_fail (caps->refcount > 0, NULL);
 
-  GST_CAPS_LOCK (caps);
   caps->refcount--;
   zero = (caps->refcount == 0);
   next = &caps->next;
-  GST_CAPS_UNLOCK (caps);
 
   if (*next)
     *next = gst_caps_unref (*next);
@@ -211,9 +251,7 @@ gst_caps_ref (GstCaps *caps)
 {
   g_return_val_if_fail (caps != NULL, NULL);
 
-  GST_CAPS_LOCK (caps);
   caps->refcount++;
-  GST_CAPS_UNLOCK (caps);
 
   return caps;
 }
@@ -289,9 +327,7 @@ gst_caps_copy_on_write (GstCaps *caps)
 
   g_return_val_if_fail (caps != NULL, NULL);
 
-  GST_CAPS_LOCK (caps);
   needcopy = (caps->refcount > 1);
-  GST_CAPS_UNLOCK (caps);
 
   if (needcopy) {
     new = gst_caps_copy (caps);
@@ -486,9 +522,7 @@ gst_caps_append (GstCaps *caps, GstCaps *capstoadd)
 {
   GstCaps *orig = caps;
   
-  g_return_val_if_fail (caps != capstoadd, caps);
-
-  if (caps == NULL)
+  if (caps == NULL || caps == capstoadd)
     return capstoadd;
   
   while (caps->next) {
@@ -556,7 +590,7 @@ static gboolean
 gst_caps_check_compatibility_func (GstCaps *fromcaps, GstCaps *tocaps)
 {
   if (fromcaps->id != tocaps->id) {
-    GST_DEBUG (GST_CAT_CAPS,"mime types differ (%s to %s)\n",
+    GST_DEBUG (GST_CAT_CAPS,"mime types differ (%s to %s)",
               gst_type_find_by_id (fromcaps->id)->mime, 
               gst_type_find_by_id (tocaps->id)->mime);
     return FALSE;
@@ -567,13 +601,13 @@ gst_caps_check_compatibility_func (GstCaps *fromcaps, GstCaps *tocaps)
       return gst_props_check_compatibility (fromcaps->properties, tocaps->properties);
     }
     else {
-      GST_DEBUG (GST_CAT_CAPS,"no source caps\n");
+      GST_DEBUG (GST_CAT_CAPS,"no source caps");
       return FALSE;
     }
   }
   else {
     /* assume it accepts everything */
-    GST_DEBUG (GST_CAT_CAPS,"no caps\n");
+    GST_DEBUG (GST_CAT_CAPS,"no caps");
     return TRUE;
   }
 }
@@ -592,17 +626,17 @@ gst_caps_check_compatibility (GstCaps *fromcaps, GstCaps *tocaps)
 {
   if (fromcaps == NULL) {
     if (tocaps == NULL) {
-      GST_DEBUG (GST_CAT_CAPS,"no caps\n");
+      GST_DEBUG (GST_CAT_CAPS,"no caps");
       return TRUE;
     }
     else {
-      GST_DEBUG (GST_CAT_CAPS,"no source but destination caps\n");
+      GST_DEBUG (GST_CAT_CAPS,"no source but destination caps");
       return FALSE;
     }
   }
   else {
     if (tocaps == NULL) {
-      GST_DEBUG (GST_CAT_CAPS,"source caps and no destination caps\n");
+      GST_DEBUG (GST_CAT_CAPS,"source caps and no destination caps");
       return TRUE;
     }
   }
@@ -628,7 +662,7 @@ gst_caps_intersect_func (GstCaps *caps1, GstCaps *caps2)
   GstProps *props;
 
   if (caps1->id != caps2->id) {
-    GST_DEBUG (GST_CAT_CAPS,"mime types differ (%s to %s)\n",
+    GST_DEBUG (GST_CAT_CAPS,"mime types differ (%s to %s)",
               gst_type_find_by_id (caps1->id)->mime, 
               gst_type_find_by_id (caps2->id)->mime);
     return NULL;
@@ -665,11 +699,11 @@ gst_caps_intersect (GstCaps *caps1, GstCaps *caps2)
   GstCaps *result = NULL, *walk = NULL;
 
   if (caps1 == NULL) {
-    GST_DEBUG (GST_CAT_CAPS, "first caps is NULL, return other caps\n");
+    GST_DEBUG (GST_CAT_CAPS, "first caps is NULL, return other caps");
     return gst_caps_copy (caps2);
   }
   if (caps2 == NULL) {
-    GST_DEBUG (GST_CAT_CAPS, "second caps is NULL, return other caps\n");
+    GST_DEBUG (GST_CAT_CAPS, "second caps is NULL, return other caps");
     return gst_caps_copy (caps1);
   }
 
@@ -697,6 +731,17 @@ gst_caps_intersect (GstCaps *caps1, GstCaps *caps2)
   return result;
 }
 
+/**
+ * gst_caps_normalize:
+ * @caps: a capabilty
+ *
+ * Make the normalisation of the caps. This will return a new caps
+ * that is equivalent to the input caps with the exception that all
+ * lists are unrolled. This function is useful when you want to iterate
+ * the caps.
+ *
+ * Returns: The normalisation of the caps.
+ */
 GstCaps*
 gst_caps_normalize (GstCaps *caps)
 {
@@ -793,7 +838,6 @@ gst_caps_load_thyself (xmlNodePtr parent)
       g_mutex_unlock (_gst_caps_chunk_lock);
 
       caps->refcount = 1;
-      caps->lock = g_mutex_new ();
       caps->next = NULL;
       caps->fixed = TRUE;