metacontainer: Finnish GESMetaContainer implementation
authorThibault Saunier <thibault.saunier@collabora.com>
Mon, 17 Dec 2012 18:23:39 +0000 (15:23 -0300)
committerThibault Saunier <thibault.saunier@collabora.com>
Wed, 19 Dec 2012 14:45:38 +0000 (11:45 -0300)
docs/libs/ges-sections.txt
ges/ges-enums.c
ges/ges-enums.h
ges/ges-meta-container.c
ges/ges-meta-container.h
ges/ges.c

index 1ca8c95..c5a4bae 100644 (file)
@@ -32,9 +32,12 @@ GESVideoTestPattern
 GESPipelineFlags
 GESEdge
 GESEditMode
+GESMetaFlag
 <SUBSECTION Standard>
 GES_TYPE_TRACK_TYPE
 ges_track_type_get_type
+GES_META_FLAG_TYPE
+ges_meta_flag_get_type
 GES_VIDEO_STANDARD_TRANSITION_TYPE_TYPE
 ges_video_standard_transition_type_get_type
 GES_TEXT_HALIGN_TYPE
@@ -917,10 +920,29 @@ ges_meta_container_set_int64
 ges_meta_container_set_string
 ges_meta_container_set_uint
 ges_meta_container_set_uint64
-ges_meta_container_set_value
-ges_meta_container_to_string
+ges_meta_container_set_meta
+ges_meta_container_register_meta_boolean
+ges_meta_container_register_meta_int
+ges_meta_container_register_meta_uint
+ges_meta_container_register_meta_int64
+ges_meta_container_register_meta_uint64
+ges_meta_container_register_meta_float
+ges_meta_container_register_meta_double
+ges_meta_container_register_meta_date
+ges_meta_container_register_meta_date_time
+ges_meta_container_register_meta_string
+ges_meta_container_register_meta
+ges_meta_container_metas_to_string
 ges_meta_container_add_metas_from_string
 ges_meta_container_get_type
+
+GES_META_FORMATTER_NAME
+GES_META_FORMATTER_MIMETYPE
+GES_META_FORMATTER_EXTENSION
+GES_META_FORMATTER_VERSION
+GES_META_FORMATTER_RANK
+GES_META_DESCRIPTION
+
 <SUBSECTION Standard>
 GESMetaContainerInterface
 GES_IS_META_CONTAINER
index 15702c2..febf817 100644 (file)
@@ -618,3 +618,26 @@ ges_video_test_pattern_get_type (void)
 
   return theType;
 }
+
+static void
+register_ges_meta_flag (GType * id)
+{
+  static const GFlagsValue values[] = {
+    {C_ENUM (GES_META_READABLE), "GES_META_READABLE", "readable"},
+    {C_ENUM (GES_META_WRITABLE), "GES_META_WRITABLE", "writable"},
+    {C_ENUM (GES_META_READ_WRITE), "GES_META_READ_WRITE", "readwrite"},
+    {0, NULL, NULL}
+  };
+
+  *id = g_flags_register_static ("GESMetaFlag", values);
+}
+
+GType
+ges_meta_flag_get_type (void)
+{
+  static GType id;
+  static GOnce once = G_ONCE_INIT;
+
+  g_once (&once, (GThreadFunc) register_ges_meta_flag, &id);
+  return id;
+}
index 6f8d31b..87006ca 100644 (file)
@@ -52,6 +52,21 @@ typedef enum {
   GES_TRACK_TYPE_CUSTOM  = 1 << 4,
 } GESTrackType;
 
+#define GES_META_FLAG_TYPE (ges_meta_flag_get_type ())
+GType ges_meta_flag_get_type (void);
+
+/**
+ * GESMetaFlag:
+ * @GES_META_READABLE: The metadata is readable
+ * @GES_META_WRITABLE: The metadata is writable
+ * @GES_META_READ_WRITE: The metadata is readable and writable
+ */
+typedef enum {
+  GES_META_READABLE  = 1 << 0,
+  GES_META_WRITABLE = 1 << 1,
+  GES_META_READ_WRITE = GES_META_READABLE | GES_META_WRITABLE
+} GESMetaFlag;
+
 /**
  * GESVideoStandardTransitionType:
  * @GES_VIDEO_STANDARD_TRANSITION_TYPE_NONE: Transition type has not been set,
index f49ba1b..42c5929 100644 (file)
 #include "ges-meta-container.h"
 
 /**
-* SECTION: ges-metadata-container
-* @short_description: An interface for storing metadata
+* SECTION: ges-meta-container
+* @short_description: An interface for storing meta
 *
-* Interface that allows reading and writing metadata
+* Interface that allows reading and writing meta
 */
 
-static GQuark ges_taglist_key;
+static GQuark ges_meta_key;
 
-typedef struct
+G_DEFINE_INTERFACE_WITH_CODE (GESMetaContainer, ges_meta_container,
+    G_TYPE_OBJECT, ges_meta_key =
+    g_quark_from_static_string ("ges-meta-container-data"););
+
+enum
 {
-  GstTagMergeMode mode;
-  GstTagList *list;
-  GMutex lock;
-} GESMetadata;
+  NOTIFY_SIGNAL,
+  LAST_SIGNAL
+};
 
-#define GES_METADATA_LOCK(data) g_mutex_lock(&data->lock)
-#define GES_METADATA_UNLOCK(data) g_mutex_unlock(&data->lock)
+static guint _signals[LAST_SIGNAL] = { 0 };
 
-G_DEFINE_INTERFACE_WITH_CODE (GESMetadataContainer, ges_meta_container,
-    G_TYPE_OBJECT, ges_taglist_key =
-    g_quark_from_static_string ("ges-metadata-container-data"););
+typedef struct RegisteredMeta
+{
+  GType item_type;
+  GESMetaFlag flags;
+} RegisteredMeta;
+
+typedef struct ContainerData
+{
+  GstStructure *structure;
+  GHashTable *static_items;
+} ContainerData;
 
 static void
-ges_meta_container_default_init (GESMetadataContainerInterface * iface)
+ges_meta_container_default_init (GESMetaContainerInterface * iface)
 {
 
+  /**
+   * GESMetaContainer::notify:
+   * @container: a #GESMetaContainer
+   * @prop: the key of the value that changed
+   * @value: the #GValue containing the new value
+   *
+   * The notify signal is used to be notify of changes of values
+   * of some metadatas
+   */
+  _signals[NOTIFY_SIGNAL] =
+      g_signal_new ("notify-meta", G_TYPE_FROM_INTERFACE (iface),
+      G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED |
+      G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_generic,
+      G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_VALUE);
 }
 
 static void
-ges_metadata_free (gpointer p)
+_free_meta_container_data (ContainerData * data)
 {
-  GESMetadata *data = (GESMetadata *) p;
+  gst_structure_free (data->structure);
+  g_hash_table_unref (data->static_items);
 
-  if (data->list)
-    gst_tag_list_unref (data->list);
+  g_slice_free (ContainerData, data);
+}
 
-  g_mutex_clear (&data->lock);
+static void
+_free_static_item (RegisteredMeta * item)
+{
+  g_slice_free (RegisteredMeta, item);
+}
 
-  g_slice_free (GESMetadata, data);
+static ContainerData *
+_create_container_data (GESMetaContainer * container)
+{
+  ContainerData *data = g_slice_new (ContainerData);
+  data->structure = gst_structure_new_empty ("metadatas");
+  data->static_items = g_hash_table_new_full (g_str_hash, g_str_equal,
+      g_free, (GDestroyNotify) (GDestroyNotify) _free_static_item);
+  g_object_set_qdata_full (G_OBJECT (container), ges_meta_key, data,
+      (GDestroyNotify) _free_meta_container_data);
+
+  return data;
 }
 
-static GESMetadata *
-ges_meta_container_get_data (GESMetadataContainer * container)
+static GstStructure *
+_meta_container_get_structure (GESMetaContainer * container)
 {
-  GESMetadata *data;
+  ContainerData *data;
 
-  data = g_object_get_qdata (G_OBJECT (container), ges_taglist_key);
-  if (!data) {
-    /* make sure no other thread is creating a GstTagData at the same time */
-    static GMutex create_mutex; /* no initialisation required */
-    g_mutex_lock (&create_mutex);
-
-    data = g_object_get_qdata (G_OBJECT (container), ges_taglist_key);
-    if (!data) {
-      data = g_slice_new (GESMetadata);
-      g_mutex_init (&data->lock);
-      data->list = gst_tag_list_new_empty ();
-      data->mode = GST_TAG_MERGE_KEEP;
-      g_object_set_qdata_full (G_OBJECT (container), ges_taglist_key, data,
-          ges_metadata_free);
-    }
-
-    g_mutex_unlock (&create_mutex);
-  }
+  data = g_object_get_qdata (G_OBJECT (container), ges_meta_key);
+  if (!data)
+    data = _create_container_data (container);
 
-  return data;
+  return data->structure;
 }
 
 typedef struct
 {
-  GESMetadataForeachFunc func;
-  const GESMetadataContainer *container;
+  GESMetaForeachFunc func;
+  const GESMetaContainer *container;
   gpointer data;
 } MetadataForeachData;
 
 static void
-tag_list_foreach (const GstTagList * taglist, const gchar * tag,
+structure_foreach_wrapper (GQuark field_id, const GValue * value,
     gpointer user_data)
 {
   MetadataForeachData *data = (MetadataForeachData *) user_data;
 
-  GValue value = { 0, };
+  data->func (data->container, g_quark_to_string (field_id), value, data->data);
+}
 
-  if (!gst_tag_list_copy_value (&value, taglist, tag))
-    return;
+static gboolean
+_append_foreach (GQuark field_id, const GValue * value, GESMetaContainer * self)
+{
+  ges_meta_container_set_meta (self, g_quark_to_string (field_id), value);
 
-  data->func (data->container, tag, &value, data->data);
+  return TRUE;
 }
 
 /**
- * ges_metadata_container_foreach:
+ * ges_meta_container_foreach:
  * @container: container to iterate over
- * @func: (scope call): function to be called for each tag
+ * @func: (scope call): function to be called for each metadata
  * @user_data: (closure): user specified data
  *
- * Calls the given function for each tag inside the metadata container. Note
- * that if there is no tag, the function won't be called at all.
+ * Calls the given function for each metadata inside the meta container. Note
+ * that if there is no metadata, the function won't be called at all.
  */
 void
-ges_metadata_container_foreach (GESMetadataContainer * container,
-    GESMetadataForeachFunc func, gpointer user_data)
+ges_meta_container_foreach (GESMetaContainer * container,
+    GESMetaForeachFunc func, gpointer user_data)
 {
-  GESMetadata *data;
+  GstStructure *structure;
   MetadataForeachData foreach_data;
 
-  g_return_if_fail (GES_IS_METADATA_CONTAINER (container));
+  g_return_if_fail (GES_IS_META_CONTAINER (container));
   g_return_if_fail (func != NULL);
 
-  data = ges_meta_container_get_data (container);
+  structure = _meta_container_get_structure (container);
 
   foreach_data.func = func;
   foreach_data.container = container;
   foreach_data.data = user_data;
 
-  gst_tag_list_foreach (data->list, (GstTagForeachFunc) tag_list_foreach,
-      &foreach_data);
+  gst_structure_foreach (structure,
+      (GstStructureForeachFunc) structure_foreach_wrapper, &foreach_data);
 }
 
-/**
- * ges_meta_container_set_boolean:
- * @container: Target container
- * @metadata_item: Name of the metadata item to set
- * @value: Value to set
- * Sets the value of a given metadata item
- */
-void
-ges_meta_container_set_boolean (GESMetadataContainer * container,
-    const gchar * metadata_item, gboolean value)
+/* _can_write_value should have been checked before calling */
+static gboolean
+_register_meta (GESMetaContainer * container, GESMetaFlag flags,
+    const gchar * meta_item, GType type)
 {
-  GESMetadata *data;
+  ContainerData *data;
+  RegisteredMeta *static_item;
+
+  data = g_object_get_qdata (G_OBJECT (container), ges_meta_key);
+  if (!data)
+    data = _create_container_data (container);
+  else if (g_hash_table_lookup (data->static_items, meta_item)) {
+    GST_WARNING_OBJECT (container, "Static meta %s already registered",
+        meta_item);
 
-  g_return_if_fail (GES_IS_METADATA_CONTAINER (container));
-  g_return_if_fail (metadata_item != NULL);
+    return FALSE;
+  }
 
-  data = ges_meta_container_get_data (container);
+  static_item = g_slice_new0 (RegisteredMeta);
+  static_item->item_type = type;
+  static_item->flags = flags;
+  g_hash_table_insert (data->static_items, g_strdup (meta_item), static_item);
 
-  GES_METADATA_LOCK (data);
-  ges_metadata_register (metadata_item, G_TYPE_BOOLEAN);
-  gst_tag_list_add (data->list, data->mode, metadata_item, value, NULL);
-  GES_METADATA_UNLOCK (data);
+  return TRUE;
 }
 
-/**
- * ges_meta_container_set_int:
- * @container: Target container
- * @metadata_item: Name of the metadata item to set
- * @value: Value to set
- * Sets the value of a given metadata item
- */
-void
-ges_meta_container_set_int (GESMetadataContainer * container,
-    const gchar * metadata_item, gint value)
+static gboolean
+_set_value (GESMetaContainer * container, const gchar * meta_item,
+    const GValue * value)
 {
-  GESMetadata *data;
+  GstStructure *structure;
+  gchar *val = gst_value_serialize (value);
 
-  g_return_if_fail (GES_IS_METADATA_CONTAINER (container));
-  g_return_if_fail (metadata_item != NULL);
+  if (val == NULL) {
+    GST_WARNING_OBJECT (container, "Could not set value on item: %s",
+        meta_item);
 
-  data = ges_meta_container_get_data (container);
+    g_free (val);
+    return FALSE;
+  }
 
-  GES_METADATA_LOCK (data);
-  ges_metadata_register (metadata_item, G_TYPE_INT);
-  gst_tag_list_add (data->list, data->mode, metadata_item, value, NULL);
-  GES_METADATA_UNLOCK (data);
+  structure = _meta_container_get_structure (container);
+
+  GST_DEBUG_OBJECT (container, "Setting meta_item %s value: %s::%s",
+      meta_item, G_VALUE_TYPE_NAME (value), val);
+
+  gst_structure_set_value (structure, meta_item, value);
+  g_signal_emit (container, _signals[NOTIFY_SIGNAL], 0, meta_item, value);
+
+  g_free (val);
+  return TRUE;
 }
 
-/**
- * ges_meta_container_set_uint:
- * @container: Target container
- * @metadata_item: Name of the metadata item to set
- * @value: Value to set
- * Sets the value of a given metadata item
- */
-void
-ges_meta_container_set_uint (GESMetadataContainer * container,
-    const gchar * metadata_item, guint value)
+static gboolean
+_can_write_value (GESMetaContainer * container, const gchar * item_name,
+    GType type)
 {
-  GESMetadata *data;
+  ContainerData *data;
+  RegisteredMeta *static_item = NULL;
 
-  g_return_if_fail (GES_IS_METADATA_CONTAINER (container));
-  g_return_if_fail (metadata_item != NULL);
+  data = g_object_get_qdata (G_OBJECT (container), ges_meta_key);
+  if (!data) {
+    data = _create_container_data (container);
+    return TRUE;
+  }
+
+  static_item = g_hash_table_lookup (data->static_items, item_name);
+
+  if (static_item == NULL)
+    return TRUE;
 
-  data = ges_meta_container_get_data (container);
+  if ((static_item->flags & GES_META_WRITABLE) == FALSE) {
+    GST_WARNING_OBJECT (container, "Can not write %s", item_name);
+    return FALSE;
+  }
 
-  GES_METADATA_LOCK (data);
-  ges_metadata_register (metadata_item, G_TYPE_UINT);
-  gst_tag_list_add (data->list, data->mode, metadata_item, value, NULL);
-  GES_METADATA_UNLOCK (data);
+  if (static_item->item_type != type) {
+    GST_WARNING_OBJECT (container, "Can not set value of type %s on %s "
+        "its type is: %s", g_type_name (static_item->item_type), item_name,
+        g_type_name (type));
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+#define CREATE_SETTER(name, value_ctype, value_gtype,  setter_name)     \
+gboolean                                                                \
+ges_meta_container_set_ ## name (GESMetaContainer *container,      \
+                           const gchar *meta_item, value_ctype value)   \
+{                                                                       \
+  GValue gval = { 0 };                                                  \
+                                                                        \
+  g_return_val_if_fail (GES_IS_META_CONTAINER (container), FALSE);      \
+  g_return_val_if_fail (meta_item != NULL, FALSE);                      \
+                                                                        \
+  if (_can_write_value (container, meta_item, value_gtype) == FALSE)    \
+    return FALSE;                                                       \
+                                                                        \
+  g_value_init (&gval, value_gtype);                                    \
+  g_value_set_ ##setter_name (&gval, value);                            \
+                                                                        \
+  return _set_value (container, meta_item, &gval);                      \
 }
 
 /**
- * ges_meta_container_set_int64:
+ * ges_meta_container_set_boolean:
  * @container: Target container
- * @metadata_item: Name of the metadata item to set
- * @value: Value to set
- * Sets the value of a given metadata item
+ * @meta_item: Name of the meta item to set
+ * @value: (allow-none): Value to set
+ *
+ * Sets the value of a given meta item
+ *
+ * Return: %TRUE if the meta could be added, %FALSE otherwize
  */
-void
-ges_meta_container_set_int64 (GESMetadataContainer * container,
-    const gchar * metadata_item, gint64 value)
-{
-  GESMetadata *data;
+CREATE_SETTER (boolean, gboolean, G_TYPE_BOOLEAN, boolean)
 
-  g_return_if_fail (GES_IS_METADATA_CONTAINER (container));
-  g_return_if_fail (metadata_item != NULL);
+/**
+ * ges_meta_container_set_int:
+ * @container: Target container
+ * @meta_item: Name of the meta item to set
+ * @value: Value to set
+ *
+ * Sets the value of a given meta item
+ *
+ * Return: %TRUE if the meta could be added, %FALSE otherwize
+ */
+    CREATE_SETTER (int, gint, G_TYPE_INT, int)
 
-  data = ges_meta_container_get_data (container);
+/**
+ * ges_meta_container_set_uint:
+ * @container: Target container
+ * @meta_item: Name of the meta item to set
+ * @value: Value to set
+ *
+ * Sets the value of a given meta item
+ *
+ * Return: %TRUE if the meta could be added, %FALSE otherwize
+ */
+    CREATE_SETTER (uint, guint, G_TYPE_UINT, uint)
 
-  GES_METADATA_LOCK (data);
-  ges_metadata_register (metadata_item, G_TYPE_INT64);
-  gst_tag_list_add (data->list, data->mode, metadata_item, value, NULL);
-  GES_METADATA_UNLOCK (data);
-}
+/**
+ * ges_meta_container_set_int64:
+ * @container: Target container
+ * @meta_item: Name of the meta item to set
+ * @value: Value to set
+ *
+ * Sets the value of a given meta item
+ *
+ * Return: %TRUE if the meta could be added, %FALSE otherwize
+ */
+    CREATE_SETTER (int64, gint64, G_TYPE_INT64, int64)
 
 /**
  * ges_meta_container_set_uint64:
  * @container: Target container
- * @metadata_item: Name of the metadata item to set
+ * @meta_item: Name of the meta item to set
  * @value: Value to set
- * Sets the value of a given metadata item
+ *
+ * Sets the value of a given meta item
+ *
+ * Return: %TRUE if the meta could be added, %FALSE otherwize
  */
-void
-ges_meta_container_set_uint64 (GESMetadataContainer * container,
-    const gchar * metadata_item, guint64 value)
-{
-  GESMetadata *data;
-
-  g_return_if_fail (GES_IS_METADATA_CONTAINER (container));
-  g_return_if_fail (metadata_item != NULL);
-
-  data = ges_meta_container_get_data (container);
-
-  GES_METADATA_LOCK (data);
-  ges_metadata_register (metadata_item, G_TYPE_UINT64);
-  gst_tag_list_add (data->list, data->mode, metadata_item, value, NULL);
-  GES_METADATA_UNLOCK (data);
-}
+    CREATE_SETTER (uint64, guint64, G_TYPE_UINT64, uint64)
 
 /**
  * ges_meta_container_set_float:
  * @container: Target container
- * @metadata_item: Name of the metadata item to set
+ * @meta_item: Name of the meta item to set
  * @value: Value to set
- * Sets the value of a given metadata item
+ *
+ * Sets the value of a given meta item
+ *
+ * Return: %TRUE if the meta could be added, %FALSE otherwize
  */
-void
-ges_meta_container_set_float (GESMetadataContainer * container,
-    const gchar * metadata_item, gfloat value)
-{
-  GESMetadata *data;
-
-  g_return_if_fail (GES_IS_METADATA_CONTAINER (container));
-  g_return_if_fail (metadata_item != NULL);
-
-  data = ges_meta_container_get_data (container);
-
-  GES_METADATA_LOCK (data);
-  ges_metadata_register (metadata_item, G_TYPE_FLOAT);
-  gst_tag_list_add (data->list, data->mode, metadata_item, value, NULL);
-  GES_METADATA_UNLOCK (data);
-}
+    CREATE_SETTER (float, float, G_TYPE_FLOAT, float)
 
 /**
  * ges_meta_container_set_double:
  * @container: Target container
- * @metadata_item: Name of the metadata item to set
+ * @meta_item: Name of the meta item to set
  * @value: Value to set
- * Sets the value of a given metadata item
+ *
+ * Sets the value of a given meta item
+ *
+ * Return: %TRUE if the meta could be added, %FALSE otherwize
  */
-void
-ges_meta_container_set_double (GESMetadataContainer * container,
-    const gchar * metadata_item, gdouble value)
-{
-  GESMetadata *data;
+CREATE_SETTER (double, double, G_TYPE_DOUBLE, double)
 
-  g_return_if_fail (GES_IS_METADATA_CONTAINER (container));
-  g_return_if_fail (metadata_item != NULL);
+/**
+ * ges_meta_container_set_date:
+ * @container: Target container
+ * @meta_item: Name of the meta item to set
+ * @value: Value to set
+ *
+ * Sets the value of a given meta item
+ *
+ * Return: %TRUE if the meta could be added, %FALSE otherwize
+ */
+CREATE_SETTER (date, const GDate *, G_TYPE_DATE, boxed)
 
-  data = ges_meta_container_get_data (container);
+/**
+ * ges_meta_container_set_date_time:
+ * @container: Target container
+ * @meta_item: Name of the meta item to set
+ * @value: Value to set
+ *
+ * Sets the value of a given meta item
+ *
+ * Return: %TRUE if the meta could be added, %FALSE otherwize
+ */
+CREATE_SETTER (date_time, const GstDateTime *, GST_TYPE_DATE_TIME, boxed)
 
-  GES_METADATA_LOCK (data);
-  ges_metadata_register (metadata_item, G_TYPE_DOUBLE);
-  gst_tag_list_add (data->list, data->mode, metadata_item, value, NULL);
-  GES_METADATA_UNLOCK (data);
-}
+/**
+* ges_meta_container_set_string:
+* @container: Target container
+* @meta_item: Name of the meta item to set
+* @value: Value to set
+*
+* Sets the value of a given meta item
+*
+* Return: %TRUE if the meta could be added, %FALSE otherwize
+*/
+CREATE_SETTER (string, const gchar *, G_TYPE_STRING, string)
 
 /**
- * ges_meta_container_set_date:
+ * ges_meta_container_set_meta:
  * @container: Target container
- * @metadata_item: Name of the metadata item to set
+ * @meta_item: Name of the meta item to set
  * @value: Value to set
- * Sets the value of a given metadata item
+ * Sets the value of a given meta item
+ *
+ * Return: %TRUE if the meta could be added, %FALSE otherwize
  */
-void
-ges_meta_container_set_date (GESMetadataContainer * container,
-    const gchar * metadata_item, const GDate * value)
+  gboolean
+ges_meta_container_set_meta (GESMetaContainer * container,
+    const gchar * meta_item, const GValue * value)
 {
-  GESMetadata *data;
+  g_return_val_if_fail (GES_IS_META_CONTAINER (container), FALSE);
+  g_return_val_if_fail (meta_item != NULL, FALSE);
 
-  g_return_if_fail (GES_IS_METADATA_CONTAINER (container));
-  g_return_if_fail (metadata_item != NULL);
+  if (_can_write_value (container, meta_item, G_VALUE_TYPE (value)) == FALSE)
+    return FALSE;
 
-  data = ges_meta_container_get_data (container);
+  _set_value (container, meta_item, value);
 
-  GES_METADATA_LOCK (data);
-  ges_metadata_register (metadata_item, G_TYPE_DATE);
-  gst_tag_list_add (data->list, data->mode, metadata_item, value, NULL);
-  GES_METADATA_UNLOCK (data);
+  return TRUE;
 }
 
 /**
- * ges_meta_container_set_date_time:
- * @container: Target container
- * @metadata_item: Name of the metadata item to set
- * @value: Value to set
- * Sets the value of a given metadata item
+ * ges_meta_container_metas_to_string:
+ * @container: a #GESMetaContainer
+ *
+ * Serializes a meta container to a string.
+ *
+ * Returns: a newly-allocated string, or NULL in case of an error. The
+ *    string must be freed with g_free() when no longer needed.
  */
-void
-ges_meta_container_set_date_time (GESMetadataContainer * container,
-    const gchar * metadata_item, const GstDateTime * value)
+gchar *
+ges_meta_container_metas_to_string (GESMetaContainer * container)
 {
-  GESMetadata *data;
+  GstStructure *structure;
 
-  g_return_if_fail (GES_IS_METADATA_CONTAINER (container));
-  g_return_if_fail (metadata_item != NULL);
+  g_return_val_if_fail (GES_IS_META_CONTAINER (container), NULL);
 
-  data = ges_meta_container_get_data (container);
+  structure = _meta_container_get_structure (container);
 
-  GES_METADATA_LOCK (data);
-  ges_metadata_register (metadata_item, GST_TYPE_DATE_TIME);
-  gst_tag_list_add (data->list, data->mode, metadata_item, value, NULL);
-  GES_METADATA_UNLOCK (data);
+  return gst_structure_to_string (structure);
 }
 
 /**
- * ges_meta_container_set_string:
- * @container: Target container
- * @metadata_item: Name of the metadata item to set
- * @value: Value to set
- * Sets the value of a given metadata item
+ * ges_meta_container_add_metas_from_string:
+ * @str: a string created with ges_meta_container_metas_to_string()
+ *
+ * Deserializes a meta container.
+ *
+ * Returns: (transfer full): a new #GESMetaContainer, or NULL in case of an
+ * error.
  */
-void
-ges_meta_container_set_string (GESMetadataContainer * container,
-    const gchar * metadata_item, const gchar * value)
+gboolean
+ges_meta_container_add_metas_from_string (GESMetaContainer * container,
+    const gchar * str)
 {
-  GESMetadata *data;
+  GstStructure *n_structure;
 
-  g_return_if_fail (GES_IS_METADATA_CONTAINER (container));
-  g_return_if_fail (metadata_item != NULL);
+  g_return_val_if_fail (GES_IS_META_CONTAINER (container), FALSE);
 
-  data = ges_meta_container_get_data (container);
+  n_structure = gst_structure_from_string (str, NULL);
+  if (n_structure == NULL) {
+    GST_WARNING_OBJECT (container, "Could not add metas: %s", str);
+    return FALSE;
+  }
+
+  gst_structure_foreach (n_structure, (GstStructureForeachFunc) _append_foreach,
+      container);
+
+  return TRUE;
+}
 
-  GES_METADATA_LOCK (data);
-  ges_metadata_register (metadata_item, G_TYPE_STRING);
-  gst_tag_list_add (data->list, data->mode, metadata_item, value, NULL);
-  GES_METADATA_UNLOCK (data);
+#define CREATE_REGISTER_STATIC(name, value_ctype, value_gtype, setter_name) \
+gboolean                                                                      \
+ges_meta_container_register_meta_ ## name (GESMetaContainer *container,\
+    GESMetaFlag flags, const gchar *meta_item, value_ctype value)             \
+{                                                                             \
+  GValue gval = { 0 };                                                        \
+                                                                              \
+  g_return_val_if_fail (GES_IS_META_CONTAINER (container), FALSE);            \
+  g_return_val_if_fail (meta_item != NULL, FALSE);                            \
+                                                                              \
+  if (!_register_meta (container, flags, meta_item, value_gtype))       \
+    return FALSE;                                                             \
+                                                                              \
+  g_value_init (&gval, value_gtype);                                          \
+  g_value_set_ ##setter_name (&gval, value);                                  \
+                                                                              \
+  return _set_value (container, meta_item, &gval);                            \
 }
 
 /**
- * ges_meta_container_set_value:
+ * register_meta_:
  * @container: Target container
- * @metadata_item: Name of the metadata item to set
- * @value: Value to set
- * Sets the value of a given metadata item
+ * @flags: The #GESMetaFlag to be used
+ * @meta_item: Name of the meta item to set
+ * @value: (allow-none): Value to set
+ *
+ * Sets a static meta on @container. This method lets you define static
+ * metadatas, which means that the type of the registered will be the only
+ * type accepted for this meta on that particular @container.
+ *
+ * Return: %TRUE if the meta could be register, %FALSE otherwize
  */
-void
-ges_meta_container_set_meta (GESMetadataContainer * container,
-    const gchar * metadata_item, const GValue * value)
-{
-  GESMetadata *data;
+CREATE_REGISTER_STATIC (boolean, gboolean, G_TYPE_BOOLEAN, boolean)
 
-  g_return_if_fail (GES_IS_METADATA_CONTAINER (container));
-  g_return_if_fail (metadata_item != NULL);
+/**
+ * ges_meta_container_register_meta_int:
+ * @container: Target container
+ * @flags: The #GESMetaFlag to be used
+ * @meta_item: Name of the meta item to set
+ * @value: (allow-none): Value to set
+ *
+ * Sets a static meta on @container. This method lets you define static
+ * metadatas, which means that the type of the registered will be the only
+ * type accepted for this meta on that particular @container.
+ *
+ * Return: %TRUE if the meta could be register, %FALSE otherwize
+ */
+    CREATE_REGISTER_STATIC (int, gint, G_TYPE_INT, int)
 
-  data = ges_meta_container_get_data (container);
+/**
+ * ges_meta_container_register_meta_uint:
+ * @container: Target container
+ * @flags: The #GESMetaFlag to be used
+ * @meta_item: Name of the meta item to set
+ * @value: (allow-none): Value to set
+ *
+ * Sets a static meta on @container. This method lets you define static
+ * metadatas, which means that the type of the registered will be the only
+ * type accepted for this meta on that particular @container.
+ *
+ * Return: %TRUE if the meta could be register, %FALSE otherwize
+ */
+    CREATE_REGISTER_STATIC (uint, guint, G_TYPE_UINT, uint)
 
-  GES_METADATA_LOCK (data);
-  ges_metadata_register (metadata_item, G_TYPE_STRING);
-  gst_tag_list_add_value (data->list, data->mode, metadata_item, value);
-  GES_METADATA_UNLOCK (data);
-}
+/**
+ * ges_meta_container_register_meta_int64:
+ * @container: Target container
+ * @flags: The #GESMetaFlag to be used
+ * @meta_item: Name of the meta item to set
+ * @value: (allow-none): Value to set
+ *
+ * Sets a static meta on @container. This method lets you define static
+ * metadatas, which means that the type of the registered will be the only
+ * type accepted for this meta on that particular @container.
+ *
+ * Return: %TRUE if the meta could be register, %FALSE otherwize
+ */
+    CREATE_REGISTER_STATIC (int64, gint64, G_TYPE_INT64, int64)
 
 /**
- * ges_metadata_container_to_string:
- * @container: a #GESMetadataContainer
+ * ges_meta_container_register_meta_uint64:
+ * @container: Target container
+ * @flags: The #GESMetaFlag to be used
+ * @meta_item: Name of the meta item to set
+ * @value: (allow-none): Value to set
  *
- * Serializes a metadata container to a string.
+ * Sets a static meta on @container. This method lets you define static
+ * metadatas, which means that the type of the registered will be the only
+ * type accepted for this meta on that particular @container.
  *
- * Returns: a newly-allocated string, or NULL in case of an error. The
- *    string must be freed with g_free() when no longer needed.
+ * Return: %TRUE if the meta could be register, %FALSE otherwize
  */
-gchar *
-ges_metadata_container_to_string (GESMetadataContainer * container)
-{
-  GESMetadata *data;
+    CREATE_REGISTER_STATIC (uint64, guint64, G_TYPE_UINT64, uint64)
 
-  g_return_val_if_fail (GES_IS_METADATA_CONTAINER (container), NULL);
+/**
+ * ges_meta_container_register_meta_float:
+ * @container: Target container
+ * @flags: The #GESMetaFlag to be used
+ * @meta_item: Name of the meta item to set
+ * @value: (allow-none): Value to set
+ *
+ * Sets a static meta on @container. This method lets you define static
+ * metadatas, which means that the type of the registered will be the only
+ * type accepted for this meta on that particular @container.
+ *
+ * Return: %TRUE if the meta could be register, %FALSE otherwize
+*/
+    CREATE_REGISTER_STATIC (float, float, G_TYPE_FLOAT, float)
 
-  data = ges_meta_container_get_data (container);
+/**
+ * ges_meta_container_register_meta_double:
+ * @container: Target container
+ * @flags: The #GESMetaFlag to be used
+ * @meta_item: Name of the meta item to set
+ * @value: (allow-none): Value to set
+ *
+ * Sets a static meta on @container. This method lets you define static
+ * metadatas, which means that the type of the registered will be the only
+ * type accepted for this meta on that particular @container.
+ *
+ * Return: %TRUE if the meta could be register, %FALSE otherwize
+ */
+CREATE_REGISTER_STATIC (double, double, G_TYPE_DOUBLE, double)
 
-  return gst_tag_list_to_string (data->list);
-}
+/**
+ * ges_meta_container_register_meta_date:
+ * @container: Target container
+ * @flags: The #GESMetaFlag to be used
+ * @meta_item: Name of the meta item to set
+ * @value: (allow-none): Value to set
+ *
+ * Sets a static meta on @container. This method lets you define static
+ * metadatas, which means that the type of the registered will be the only
+ * type accepted for this meta on that particular @container.
+ *
+ * Return: %TRUE if the meta could be register, %FALSE otherwize
+ */
+CREATE_REGISTER_STATIC (date, const GDate *, G_TYPE_DATE, boxed)
 
 /**
- * ges_metadata_container_new_from_string:
- * @str: a string created with ges_metadata_container_to_string()
+ * ges_meta_container_register_meta_date_time:
+ * @container: Target container
+ * @flags: The #GESMetaFlag to be used
+ * @meta_item: Name of the meta item to set
+ * @value: (allow-none): Value to set
  *
- * Deserializes a metadata container.
+ * Sets a static meta on @container. This method lets you define static
+ * metadatas, which means that the type of the registered will be the only
+ * type accepted for this meta on that particular @container.
  *
- * Returns: (transfer full): a new #GESMetadataContainer, or NULL in case of an
- * error.
+ * Return: %TRUE if the meta could be register, %FALSE otherwize
+ */
+CREATE_REGISTER_STATIC (date_time, const GstDateTime *, GST_TYPE_DATE_TIME,
+    boxed)
+
+/**
+ * ges_meta_container_register_meta_string:
+ * @container: Target container
+ * @flags: The #GESMetaFlag to be used
+ * @meta_item: Name of the meta item to set
+ * @value: (allow-none): Value to set
+ *
+ * Sets a static meta on @container. This method lets you define static
+ * metadatas, which means that the type of the registered will be the only
+ * type accepted for this meta on that particular @container.
+ *
+ * Return: %TRUE if the meta could be register, %FALSE otherwize
  */
-GESMetadataContainer *
-ges_metadata_container_new_from_string (const gchar * str)
+CREATE_REGISTER_STATIC (string, const gchar *, G_TYPE_STRING, string)
+
+/**
+ * ges_meta_container_register_meta:
+ * @container: Target container
+ * @flags: The #GESMetaFlag to be used
+ * @meta_item: Name of the meta item to set
+ * @value: Value to set
+ *
+ * Sets a static meta on @container. This method lets you define static
+ * metadatas, which means that the type of the registered will be the only
+ * type accepted for this meta on that particular @container.
+ *
+ * Return: %TRUE if the static meta could be added, %FALSE otherwize
+ */
+  gboolean
+ges_meta_container_register_meta (GESMetaContainer * container,
+    GESMetaFlag flags, const gchar * meta_item, const GValue * value)
 {
-  return NULL;
+  g_return_val_if_fail (GES_IS_META_CONTAINER (container), FALSE);
+  g_return_val_if_fail (meta_item != NULL, FALSE);
+
+  if (!_register_meta (container, flags, meta_item, G_VALUE_TYPE (value)))
+    return FALSE;
+
+  return _set_value (container, meta_item, value);
 }
 
-void
-ges_metadata_register (const gchar * name, GType type)
+gboolean
+ges_meta_container_check_meta_registered (GESMetaContainer * container,
+    const gchar * meta_item, GESMetaFlag * flags, GType * type)
 {
-  gst_tag_register (name, GST_TAG_FLAG_META, type, name, name, NULL);
+  ContainerData *data;
+  RegisteredMeta *static_item;
+
+  data = g_object_get_qdata (G_OBJECT (container), ges_meta_key);
+  if (!data)
+    return FALSE;
+
+  static_item = g_hash_table_lookup (data->static_items, meta_item);
+  if (static_item == NULL) {
+    GST_WARNING_OBJECT (container, "Static meta %s already registered",
+        meta_item);
+
+    return FALSE;
+  }
+
+  if (type)
+    *type = static_item->item_type;
+
+  if (flags)
+    *flags = static_item->flags;
+
+  return TRUE;
 }
 
 /* Copied from gsttaglist.c */
@@ -433,83 +677,146 @@ ges_metadata_register (const gchar * name, GType type)
 
 #define CREATE_GETTER(name,type)                                         \
 gboolean                                                                 \
-ges_meta_container_get_ ## name (GESMetadataContainer *container,    \
-                           const gchar *metadata_item, type value)       \
+ges_meta_container_get_ ## name (GESMetaContainer *container,    \
+                           const gchar *meta_item, type value)       \
 {                                                                        \
-  GESMetadata *data;                                                     \
+  GstStructure *structure;                                                     \
                                                                          \
-  g_return_val_if_fail (GES_IS_METADATA_CONTAINER (container), FALSE);   \
-  g_return_val_if_fail (metadata_item != NULL, FALSE);                   \
+  g_return_val_if_fail (GES_IS_META_CONTAINER (container), FALSE);   \
+  g_return_val_if_fail (meta_item != NULL, FALSE);                   \
   g_return_val_if_fail (value != NULL, FALSE);                           \
                                                                          \
-  data = ges_meta_container_get_data (container);                    \
+  structure = _meta_container_get_structure (container);                    \
                                                                          \
-  return gst_tag_list_get_ ## name (data->list, metadata_item, value);   \
+  return gst_structure_get_ ## name (structure, meta_item, value);   \
 }
 
 /**
  * ges_meta_container_get_boolean:
  * @container: Target container
- * @metadata_item: Name of the metadata item to get
- * @dest: (out): Destination to which value of metadata item will be copied
- * Gets the value of a given metadata item, returns NULL if @metadata_item
+ * @meta_item: Name of the meta item to get
+ * @dest: (out): Destination to which value of meta item will be copied
+ * Gets the value of a given meta item, returns NULL if @meta_item
  * can not be found.
  */
 CREATE_GETTER (boolean, gboolean *);
 /**
  * ges_meta_container_get_int:
  * @container: Target container
- * @metadata_item: Name of the metadata item to get
- * @dest: (out): Destination to which value of metadata item will be copied
- * Gets the value of a given metadata item, returns NULL if @metadata_item
+ * @meta_item: Name of the meta item to get
+ * @dest: (out): Destination to which value of meta item will be copied
+ * Gets the value of a given meta item, returns NULL if @meta_item
  * can not be found.
  */
 CREATE_GETTER (int, gint *);
 /**
  * ges_meta_container_get_uint:
  * @container: Target container
- * @metadata_item: Name of the metadata item to get
- * @dest: (out): Destination to which value of metadata item will be copied
- * Gets the value of a given metadata item, returns NULL if @metadata_item
+ * @meta_item: Name of the meta item to get
+ * @dest: (out): Destination to which value of meta item will be copied
+ * Gets the value of a given meta item, returns NULL if @meta_item
  * can not be found.
  */
 CREATE_GETTER (uint, guint *);
 /**
- * ges_meta_container_get_int64:
+ * ges_meta_container_get_double:
  * @container: Target container
- * @metadata_item: Name of the metadata item to get
- * @dest: (out): Destination to which value of metadata item will be copied
- * Gets the value of a given metadata item, returns NULL if @metadata_item
+ * @meta_item: Name of the meta item to get
+ * @dest: (out): Destination to which value of meta item will be copied
+ * Gets the value of a given meta item, returns NULL if @meta_item
  * can not be found.
  */
-CREATE_GETTER (int64, gint64 *);
+CREATE_GETTER (double, gdouble *);
+
 /**
- * ges_meta_container_get_uint64:
+ * ges_meta_container_get_int64:
  * @container: Target container
- * @metadata_item: Name of the metadata item to get
- * @dest: (out): Destination to which value of metadata item will be copied
- * Gets the value of a given metadata item, returns NULL if @metadata_item
+ * @meta_item: Name of the meta item to get
+ * @dest: (out): Destination to which value of meta item will be copied
+ * Gets the value of a given meta item, returns %FALSE if @meta_item
  * can not be found.
  */
-CREATE_GETTER (uint64, guint64 *);
+gboolean
+ges_meta_container_get_int64 (GESMetaContainer * container,
+    const gchar * meta_item, gint64 * dest)
+{
+  GstStructure *structure;
+  const GValue *value;
+
+  g_return_val_if_fail (GES_IS_META_CONTAINER (container), FALSE);
+  g_return_val_if_fail (meta_item != NULL, FALSE);
+  g_return_val_if_fail (dest != NULL, FALSE);
+
+  structure = _meta_container_get_structure (container);
+
+  value = gst_structure_get_value (structure, meta_item);
+  if (!value || G_VALUE_TYPE (value) != G_TYPE_INT64)
+    return FALSE;
+
+  *dest = g_value_get_int64 (value);
+
+  return TRUE;
+}
+
 /**
- * ges_meta_container_get_float:
+ * ges_meta_container_get_uint64:
  * @container: Target container
- * @metadata_item: Name of the metadata item to get
- * @dest: (out): Destination to which value of metadata item will be copied
- * Gets the value of a given metadata item, returns NULL if @metadata_item
+ * @meta_item: Name of the meta item to get
+ * @dest: (out): Destination to which value of meta item will be copied
+ * Gets the value of a given meta item, returns NULL if @meta_item
  * can not be found.
  */
-CREATE_GETTER (float, gfloat *);
+gboolean
+ges_meta_container_get_uint64 (GESMetaContainer * container,
+    const gchar * meta_item, guint64 * dest)
+{
+  GstStructure *structure;
+  const GValue *value;
+
+  g_return_val_if_fail (GES_IS_META_CONTAINER (container), FALSE);
+  g_return_val_if_fail (meta_item != NULL, FALSE);
+  g_return_val_if_fail (dest != NULL, FALSE);
+
+  structure = _meta_container_get_structure (container);
+
+  value = gst_structure_get_value (structure, meta_item);
+  if (!value || G_VALUE_TYPE (value) != G_TYPE_UINT64)
+    return FALSE;
+
+  *dest = g_value_get_uint64 (value);
+
+  return TRUE;
+}
+
 /**
- * ges_meta_container_get_double:
+ * ges_meta_container_get_float:
  * @container: Target container
- * @metadata_item: Name of the metadata item to get
- * @dest: (out): Destination to which value of metadata item will be copied
- * Gets the value of a given metadata item, returns NULL if @metadata_item
+ * @meta_item: Name of the meta item to get
+ * @dest: (out): Destination to which value of meta item will be copied
+ * Gets the value of a given meta item, returns FALSE if @meta_item
  * can not be found.
  */
-CREATE_GETTER (double, gdouble *);
+gboolean
+ges_meta_container_get_float (GESMetaContainer * container,
+    const gchar * meta_item, gfloat * dest)
+{
+  GstStructure *structure;
+  const GValue *value;
+
+  g_return_val_if_fail (GES_IS_META_CONTAINER (container), FALSE);
+  g_return_val_if_fail (meta_item != NULL, FALSE);
+  g_return_val_if_fail (dest != NULL, FALSE);
+
+  structure = _meta_container_get_structure (container);
+
+  value = gst_structure_get_value (structure, meta_item);
+  if (!value || G_VALUE_TYPE (value) != G_TYPE_FLOAT)
+    return FALSE;
+
+  *dest = g_value_get_float (value);
+
+  return TRUE;
+}
 
 static inline gchar *
 _gst_strdup0 (const gchar * s)
@@ -523,48 +830,52 @@ _gst_strdup0 (const gchar * s)
 /**
  * ges_meta_container_get_string:
  * @container: Target container
- * @metadata_item: Name of the metadata item to get
- * @dest: (out): Destination to which value of metadata item will be copied
- * Gets the value of a given metadata item, returns NULL if @metadata_item
+ * @meta_item: Name of the meta item to get
+ * Gets the value of a given meta item, returns NULL if @meta_item
  * can not be found.
  */
-CREATE_GETTER (string, gchar **);
+const gchar *
+ges_meta_container_get_string (GESMetaContainer * container,
+    const gchar * meta_item)
+{
+  GstStructure *structure;
+
+  g_return_val_if_fail (GES_IS_META_CONTAINER (container), FALSE);
+  g_return_val_if_fail (meta_item != NULL, FALSE);
+
+  structure = _meta_container_get_structure (container);
+
+  return gst_structure_get_string (structure, meta_item);
+}
 
 /**
  * ges_meta_container_get_meta:
  * @container: Target container
- * @metadata_item: Name of the metadata item to get
- * @value: (out) (transfer full): Destination to which value of metadata item will be copied
  *
- * Gets the value of a given metadata item, returns NULL if @metadata_item
+ * Gets the value of a given meta item, returns NULL if @meta_item
  * can not be found.
  *
  * Returns: %TRUE if the vale could be optained %FALSE otherwize
  */
-gboolean
-ges_meta_container_get_meta (GESMetadataContainer * container,
-    const gchar * tag, GValue * value)
+const GValue *
+ges_meta_container_get_meta (GESMetaContainer * container, const gchar * key)
 {
-  GESMetadata *data;
+  GstStructure *structure;
 
-  g_return_val_if_fail (GES_IS_METADATA_CONTAINER (container), FALSE);
-  g_return_val_if_fail (tag != NULL, FALSE);
-  g_return_val_if_fail (value != NULL, FALSE);
+  g_return_val_if_fail (GES_IS_META_CONTAINER (container), FALSE);
+  g_return_val_if_fail (key != NULL, FALSE);
 
-  data = ges_meta_container_get_data (container);
-
-  if (!gst_tag_list_copy_value (value, data->list, tag))
-    return FALSE;
+  structure = _meta_container_get_structure (container);
 
-  return (value != NULL);
+  return gst_structure_get_value (structure, key);
 }
 
 /**
  * ges_meta_container_get_date:
  * @container: Target container
- * @metadata_item: Name of the metadata item to get
- * @dest: (out): Destination to which value of metadata item will be copied
- * Gets the value of a given metadata item, returns NULL if @metadata_item
+ * @meta_item: Name of the meta item to get
+ * @dest: (out): Destination to which value of meta item will be copied
+ * Gets the value of a given meta item, returns NULL if @meta_item
  * can not be found.
  */
 CREATE_GETTER (date, GDate **);
@@ -572,9 +883,9 @@ CREATE_GETTER (date, GDate **);
 /**
  * ges_meta_container_get_date_time:
  * @container: Target container
- * @metadata_item: Name of the metadata item to get
- * @dest: (out): Destination to which value of metadata item will be copied
- * Gets the value of a given metadata item, returns NULL if @metadata_item
+ * @meta_item: Name of the meta item to get
+ * @dest: (out): Destination to which value of meta item will be copied
+ * Gets the value of a given meta item, returns NULL if @meta_item
  * can not be found.
  */
 CREATE_GETTER (date_time, GstDateTime **);
index 80305f6..4c26821 100644 (file)
  * Boston, MA 02111-1307, USA.
  */
 
-#ifndef _GES_METADATA_CONTAINER
-#define _GES_METADATA_CONTAINER
+#ifndef _GES_META_CONTAINER
+#define _GES_META_CONTAINER
 
 #include <glib-object.h>
 #include <gst/gst.h>
 #include <ges/ges-types.h>
+#include "ges-enums.h"
 
 G_BEGIN_DECLS
 
-#define GES_TYPE_METADATA_CONTAINER                 (ges_meta_container_get_type ())
-#define GES_METADATA_CONTAINER(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), GES_TYPE_METADATA_CONTAINER, GESMetadataContainer))
-#define GES_IS_METADATA_CONTAINER(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GES_TYPE_METADATA_CONTAINER))
-#define GES_METADATA_CONTAINER_GET_INTERFACE (inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GES_TYPE_METADATA_CONTAINER, GESMetadataContainerInterface))
+#define GES_TYPE_META_CONTAINER                 (ges_meta_container_get_type ())
+#define GES_META_CONTAINER(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), GES_TYPE_META_CONTAINER, GESMetaContainer))
+#define GES_IS_META_CONTAINER(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GES_TYPE_META_CONTAINER))
+#define GES_META_CONTAINER_GET_INTERFACE (inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GES_TYPE_META_CONTAINER, GESMetaContainerInterface))
 
-typedef struct _GESMetadataContainer          GESMetadataContainer;
-typedef struct _GESMetadataContainerInterface GESMetadataContainerInterface;
+/**
+ * GES_META_FORMATTER_NAME:
+ *
+ * Name of a formatter it is used as ID of Formater assets (string)
+ *
+ * The name of the formatter
+ */
+#define GES_META_FORMATTER_NAME                       "name"
+
+/**
+ * GES_META_DESCRIPTION:
+ *
+ * The description of an object, can be used in various context (string)
+ *
+ * The description
+ */
+#define GES_META_DESCRIPTION                         "description"
+
+/**
+ * GES_META_FORMATTER_MIMETYPE:
+ *
+ * Mimetype used for the file produced by a  formatter (string)
+ *
+ * The mime type
+ */
+#define GES_META_FORMATTER_MIMETYPE                   "mimetype"
+
+/**
+ * GES_META_FORMATTER_EXTENSION:
+ *
+ * The extension of the files produced by a formatter (string)
+ */
+#define GES_META_FORMATTER_EXTENSION                  "extension"
+
+/**
+ * GES_META_FORMATTER_VERSION:
+ *
+ * The version of a formatter (double)
+ *
+ * The formatter version
+ */
+#define GES_META_FORMATTER_VERSION                    "version"
 
-struct _GESMetadataContainerInterface {
+/**
+ * GES_META_FORMATTER_RANK:
+ *
+ * The rank of a formatter (GstRank)
+ *
+ * The rank of a formatter
+ */
+#define GES_META_FORMATTER_RANK                       "rank"
+
+/**
+ * GES_META_TIMELINE_OBJECT_SUPPORTED_FORMATS:
+ *
+ * The GESTrackType on which a GESTimelineObject can create GESTrackObjects
+ */
+#define GES_META_TIMELINE_OBJECT_SUPPORTED_FORMATS    "supported-formats"
+
+typedef struct _GESMetaContainer          GESMetaContainer;
+typedef struct _GESMetaContainerInterface GESMetaContainerInterface;
+
+struct _GESMetaContainerInterface {
   GTypeInterface parent_iface;
 
   gpointer _ges_reserved[GES_PADDING];
@@ -42,136 +102,203 @@ struct _GESMetadataContainerInterface {
 
 GType ges_meta_container_get_type (void);
 
-void
-ges_meta_container_set_boolean     (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+gboolean
+ges_meta_container_set_boolean     (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         gboolean value);
 
-void
-ges_meta_container_set_int         (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+gboolean
+ges_meta_container_set_int         (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         gint value);
 
-void
-ges_meta_container_set_uint        (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+gboolean
+ges_meta_container_set_uint        (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         guint value);
 
-void
-ges_meta_container_set_int64       (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+gboolean
+ges_meta_container_set_int64       (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         gint64 value);
 
-void
-ges_meta_container_set_uint64      (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+gboolean
+ges_meta_container_set_uint64      (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         guint64 value);
 
-void
-ges_meta_container_set_float       (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+gboolean
+ges_meta_container_set_float       (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         gfloat value);
 
-void
-ges_meta_container_set_double      (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+gboolean
+ges_meta_container_set_double      (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         gdouble value);
 
-void
-ges_meta_container_set_date        (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+gboolean
+ges_meta_container_set_date        (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         const GDate* value);
 
-void
-ges_meta_container_set_date_time   (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+gboolean
+ges_meta_container_set_date_time   (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         const GstDateTime* value);
 
-void
-ges_meta_container_set_string      (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+gboolean
+ges_meta_container_set_string      (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         const gchar* value);
 
-void
-ges_meta_container_set_meta            (GESMetadataContainer * container,
-                                        const gchar* metadata_item,
+gboolean
+ges_meta_container_set_meta            (GESMetaContainer * container,
+                                        const gchar* meta_item,
                                         const GValue *value);
 
 gboolean
-ges_meta_container_get_boolean     (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+ges_meta_container_register_meta_boolean (GESMetaContainer *container,
+                                          GESMetaFlag flags,
+                                          const gchar* meta_item,
+                                          gboolean value);
+
+gboolean
+ges_meta_container_register_meta_int     (GESMetaContainer *container,
+                                          GESMetaFlag flags,
+                                          const gchar* meta_item,
+                                          gint value);
+
+gboolean
+ges_meta_container_register_meta_uint    (GESMetaContainer *container,
+                                          GESMetaFlag flags,
+                                          const gchar* meta_item,
+                                          guint value);
+
+gboolean
+ges_meta_container_register_meta_int64   (GESMetaContainer *container,
+                                          GESMetaFlag flags,
+                                          const gchar* meta_item,
+                                          gint64 value);
+
+gboolean
+ges_meta_container_register_meta_uint64  (GESMetaContainer *container,
+                                          GESMetaFlag flags,
+                                          const gchar* meta_item,
+                                          guint64 value);
+
+gboolean
+ges_meta_container_register_meta_float   (GESMetaContainer *container,
+                                          GESMetaFlag flags,
+                                          const gchar* meta_item,
+                                          gfloat value);
+
+gboolean
+ges_meta_container_register_meta_double  (GESMetaContainer *container,
+                                          GESMetaFlag flags,
+                                          const gchar* meta_item,
+                                          gdouble value);
+
+gboolean
+ges_meta_container_register_meta_date    (GESMetaContainer *container,
+                                          GESMetaFlag flags,
+                                          const gchar* meta_item,
+                                          const GDate* value);
+
+gboolean
+ges_meta_container_register_meta_date_time  (GESMetaContainer *container,
+                                             GESMetaFlag flags,
+                                             const gchar* meta_item,
+                                             const GstDateTime* value);
+
+gboolean
+ges_meta_container_register_meta_string     (GESMetaContainer *container,
+                                             GESMetaFlag flags,
+                                             const gchar* meta_item,
+                                             const gchar* value);
+
+gboolean
+ges_meta_container_register_meta            (GESMetaContainer *container,
+                                             GESMetaFlag flags,
+                                             const gchar* meta_item,
+                                             const GValue * value);
+
+gboolean
+ges_meta_container_check_meta_registered    (GESMetaContainer *container,
+                                             const gchar * meta_item,
+                                             GESMetaFlag * flags,
+                                             GType * type);
+
+gboolean
+ges_meta_container_get_boolean     (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         gboolean* dest);
 
 gboolean
-ges_meta_container_get_int         (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+ges_meta_container_get_int         (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         gint* dest);
 
 gboolean
-ges_meta_container_get_uint        (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+ges_meta_container_get_uint        (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         guint* dest);
 
 gboolean
-ges_meta_container_get_int64       (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+ges_meta_container_get_int64       (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         gint64* dest);
 
 gboolean
-ges_meta_container_get_uint64      (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+ges_meta_container_get_uint64      (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         guint64* dest);
 
 gboolean
-ges_meta_container_get_float       (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+ges_meta_container_get_float       (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         gfloat* dest);
 
 gboolean
-ges_meta_container_get_double      (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+ges_meta_container_get_double      (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         gdouble* dest);
 
 gboolean
-ges_meta_container_get_date        (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+ges_meta_container_get_date        (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         GDate** dest);
 
 gboolean
-ges_meta_container_get_date_time   (GESMetadataContainer *container,
-                                        const gchar* metadata_item,
+ges_meta_container_get_date_time   (GESMetaContainer *container,
+                                        const gchar* meta_item,
                                         GstDateTime** dest);
 
-gboolean
-ges_meta_container_get_string      (GESMetadataContainer * container,
-                                        const gchar * metadata_item,
-                                        gchar** dest);
+const gchar *
+ges_meta_container_get_string      (GESMetaContainer * container,
+                                        const gchar * meta_item);
 
-gboolean
-ges_meta_container_get_meta            (GESMetadataContainer * container,
-                                        const gchar* metadata_item,
-                                        GValue* value);
+const GValue *
+ges_meta_container_get_meta            (GESMetaContainer * container,
+                                        const gchar * key);
 
 typedef void
-(*GESMetadataForeachFunc)              (const GESMetadataContainer *container,
+(*GESMetaForeachFunc)                  (const GESMetaContainer *container,
                                         const gchar *key,
-                                        GValue *value,
+                                        const GValue *value,
                                         gpointer user_data);
 
 void
-ges_metadata_container_foreach         (GESMetadataContainer *container,
-                                        GESMetadataForeachFunc func,
+ges_meta_container_foreach             (GESMetaContainer *container,
+                                        GESMetaForeachFunc func,
                                         gpointer user_data);
 
 gchar *
-ges_metadata_container_to_string       (GESMetadataContainer *container);
-
-GESMetadataContainer *
-ges_metadata_container_new_from_string (const gchar *str);
+ges_meta_container_metas_to_string     (GESMetaContainer *container);
 
-void
-ges_metadata_register                  (const gchar *name,
-                                        GType type);
+gboolean
+ges_meta_container_add_metas_from_string (GESMetaContainer *container,
+                                          const gchar *str);
 
 G_END_DECLS
-#endif /* _GES_METADATA_CONTAINER */
+#endif /* _GES_META_CONTAINER */
index aa2498f..5eb3820 100644 (file)
--- a/ges/ges.c
+++ b/ges/ges.c
@@ -72,7 +72,8 @@ ges_init (void)
 
   /* register formatter types with the system */
   GES_TYPE_PITIVI_FORMATTER;
-  GES_TYPE_METADATA_CONTAINER;
+
+  GES_TYPE_META_CONTAINER;
 
   /* check the gnonlin elements are available */
   if (!ges_check_gnonlin_availability ())