tag: xmp: Add function to list the available schemas

Adds a function to list the available schemas in our xmp lib

https://bugzilla.gnome.org/show_bug.cgi?id=645167
This commit is contained in:
Thiago Santos 2011-03-18 09:28:23 -03:00
parent f1f0625e97
commit 6cc96a67ec
3 changed files with 101 additions and 13 deletions

View file

@ -35,6 +35,7 @@
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include "config.h" #include "config.h"
#endif #endif
#include "tag.h"
#include <gst/gsttagsetter.h> #include <gst/gsttagsetter.h>
#include "gsttageditingprivate.h" #include "gsttageditingprivate.h"
#include <stdio.h> #include <stdio.h>
@ -43,6 +44,32 @@
#include <time.h> #include <time.h>
#include <ctype.h> #include <ctype.h>
static const gchar *schema_list[] = {
"dc",
"xap",
"tiff",
"exif",
"photoshop",
"Iptc4xmpCore",
NULL
};
/**
* gst_tag_xmp_list_schemas:
*
* Gets the list of supported schemas in the xmp lib
*
* Returns: a %NULL terminated array of strings with the schema names
*
* Since: 0.10.33
*/
const gchar **
gst_tag_xmp_list_schemas (void)
{
return schema_list;
}
typedef struct _XmpSerializationData XmpSerializationData;
typedef struct _XmpTag XmpTag; typedef struct _XmpTag XmpTag;
/* /*
@ -63,6 +90,29 @@ typedef void (*XmpDeserializationFunc) (XmpTag * xmptag, GstTagList * taglist,
const gchar * gst_tag, const gchar * xmp_tag_value, const gchar * gst_tag, const gchar * xmp_tag_value,
const gchar * str, GSList ** pending_tags); const gchar * str, GSList ** pending_tags);
struct _XmpSerializationData
{
GString *data;
GList *schemas;
};
static gboolean
xmp_serialization_data_use_schema (XmpSerializationData * serdata,
const gchar * schemaname)
{
GList *iter;
if (serdata->schemas == NULL)
return TRUE;
for (iter = serdata->schemas; iter; iter = g_list_next (iter)) {
const gchar *name = (const gchar *) iter->data;
if (strcmp (name, schemaname) == 0)
return TRUE;
}
return FALSE;
}
#define GST_XMP_TAG_TYPE_SIMPLE 0 #define GST_XMP_TAG_TYPE_SIMPLE 0
#define GST_XMP_TAG_TYPE_BAG 1 #define GST_XMP_TAG_TYPE_BAG 1
@ -192,18 +242,22 @@ _gst_xmp_schema_add_simple_mapping (GstXmpSchema * schema,
* have our lists modified during usage * have our lists modified during usage
*/ */
static GPtrArray * static GPtrArray *
_xmp_tag_get_mapping (const gchar * gst_tag) _xmp_tag_get_mapping (const gchar * gst_tag, XmpSerializationData * serdata)
{ {
GPtrArray *ret = NULL; GPtrArray *ret = NULL;
GHashTableIter iter; GHashTableIter iter;
GQuark key = g_quark_from_string (gst_tag); GQuark key = g_quark_from_string (gst_tag);
gpointer iterkey, value; gpointer iterkey, value;
const gchar *schemaname;
g_hash_table_iter_init (&iter, __xmp_schemas); g_hash_table_iter_init (&iter, __xmp_schemas);
while (!ret && g_hash_table_iter_next (&iter, &iterkey, &value)) { while (!ret && g_hash_table_iter_next (&iter, &iterkey, &value)) {
GstXmpSchema *schema = (GstXmpSchema *) value; GstXmpSchema *schema = (GstXmpSchema *) value;
ret = (GPtrArray *) gst_xmp_schema_lookup (schema, GUINT_TO_POINTER (key)); schemaname = g_quark_to_string (GPOINTER_TO_UINT (iterkey));
if (xmp_serialization_data_use_schema (serdata, schemaname))
ret =
(GPtrArray *) gst_xmp_schema_lookup (schema, GUINT_TO_POINTER (key));
} }
return ret; return ret;
} }
@ -818,7 +872,7 @@ _init_xmp_tag_map ()
schema = gst_xmp_schema_new (); schema = gst_xmp_schema_new ();
_gst_xmp_schema_add_simple_mapping (schema, GST_TAG_USER_RATING, _gst_xmp_schema_add_simple_mapping (schema, GST_TAG_USER_RATING,
"xmp:Rating", GST_XMP_TAG_TYPE_SIMPLE, NULL, deserialize_xmp_rating); "xmp:Rating", GST_XMP_TAG_TYPE_SIMPLE, NULL, deserialize_xmp_rating);
_gst_xmp_add_schema ("xmp", schema); _gst_xmp_add_schema ("xap", schema);
/* tiff */ /* tiff */
schema = gst_xmp_schema_new (); schema = gst_xmp_schema_new ();
@ -1453,12 +1507,13 @@ static void
write_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data) write_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data)
{ {
guint i = 0, ct = gst_tag_list_get_tag_size (list, tag), tag_index; guint i = 0, ct = gst_tag_list_get_tag_size (list, tag), tag_index;
GString *data = user_data; XmpSerializationData *serialization_data = user_data;
GString *data = serialization_data->data;
GPtrArray *xmp_tag_array = NULL; GPtrArray *xmp_tag_array = NULL;
char *s; char *s;
/* map gst-tag to xmp tag */ /* map gst-tag to xmp tag */
xmp_tag_array = _xmp_tag_get_mapping (tag); xmp_tag_array = _xmp_tag_get_mapping (tag, serialization_data);
if (!xmp_tag_array) { if (!xmp_tag_array) {
GST_WARNING ("no mapping for %s to xmp", tag); GST_WARNING ("no mapping for %s to xmp", tag);
@ -1516,23 +1571,32 @@ write_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data)
} }
/** /**
* gst_tag_list_to_xmp_buffer: * gst_tag_list_to_xmp_buffer_full:
* @list: tags * @list: tags
* @read_only: does the container forbid inplace editing * @read_only: does the container forbid inplace editing
* @schemas: list of schemas to be used on serialization
* *
* Formats a taglist as a xmp packet. * Formats a taglist as a xmp packet using only the selected
* schemas. An empty list (%NULL) means that all schemas should
* be used
* *
* Returns: new buffer or %NULL, unref the buffer when done * Returns: new buffer or %NULL, unref the buffer when done
* *
* Since: 0.10.29 * Since: 0.10.33
*/ */
GstBuffer * GstBuffer *
gst_tag_list_to_xmp_buffer (const GstTagList * list, gboolean read_only) gst_tag_list_to_xmp_buffer_full (const GstTagList * list, gboolean read_only,
GList * schemas)
{ {
GstBuffer *buffer = NULL; GstBuffer *buffer = NULL;
GString *data = g_string_sized_new (4096); XmpSerializationData serialization_data;
GString *data;
guint i; guint i;
serialization_data.data = g_string_sized_new (4096);
serialization_data.schemas = schemas;
data = serialization_data.data;
xmp_tags_initialize (); xmp_tags_initialize ();
g_return_val_if_fail (GST_IS_TAG_LIST (list), NULL); g_return_val_if_fail (GST_IS_TAG_LIST (list), NULL);
@ -1546,15 +1610,17 @@ gst_tag_list_to_xmp_buffer (const GstTagList * list, gboolean read_only)
"<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\""); "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"");
i = 0; i = 0;
while (ns_match[i].ns_prefix) { while (ns_match[i].ns_prefix) {
g_string_append_printf (data, " xmlns:%s=\"%s\"", ns_match[i].ns_prefix, if (xmp_serialization_data_use_schema (&serialization_data,
ns_match[i].ns_uri); ns_match[i].ns_prefix))
g_string_append_printf (data, " xmlns:%s=\"%s\"",
ns_match[i].ns_prefix, ns_match[i].ns_uri);
i++; i++;
} }
g_string_append (data, ">\n"); g_string_append (data, ">\n");
g_string_append (data, "<rdf:Description rdf:about=\"\">\n"); g_string_append (data, "<rdf:Description rdf:about=\"\">\n");
/* iterate the taglist */ /* iterate the taglist */
gst_tag_list_foreach (list, write_one_tag, data); gst_tag_list_foreach (list, write_one_tag, &serialization_data);
/* xmp footer */ /* xmp footer */
g_string_append (data, "</rdf:Description>\n"); g_string_append (data, "</rdf:Description>\n");
@ -1581,5 +1647,22 @@ gst_tag_list_to_xmp_buffer (const GstTagList * list, gboolean read_only)
return buffer; return buffer;
} }
/**
* gst_tag_list_to_xmp_buffer:
* @list: tags
* @read_only: does the container forbid inplace editing
*
* Formats a taglist as a xmp packet.
*
* Returns: new buffer or %NULL, unref the buffer when done
*
* Since: 0.10.29
*/
GstBuffer *
gst_tag_list_to_xmp_buffer (const GstTagList * list, gboolean read_only)
{
return gst_tag_list_to_xmp_buffer_full (list, read_only, NULL);
}
#undef gst_xmp_schema_lookup #undef gst_xmp_schema_lookup
#undef gst_xmp_schema_insert #undef gst_xmp_schema_insert

View file

@ -474,6 +474,9 @@ gboolean gst_tag_list_add_id3_image (GstTagList * tag_list,
GstTagList * gst_tag_list_from_xmp_buffer (const GstBuffer * buffer); GstTagList * gst_tag_list_from_xmp_buffer (const GstBuffer * buffer);
GstBuffer * gst_tag_list_to_xmp_buffer (const GstTagList * list, GstBuffer * gst_tag_list_to_xmp_buffer (const GstTagList * list,
gboolean read_only); gboolean read_only);
GstBuffer * gst_tag_list_to_xmp_buffer_full (const GstTagList * list,
gboolean read_only, GList * schemas);
const gchar** gst_tag_xmp_list_schemas (void);
/* functions related to exif */ /* functions related to exif */
GstBuffer * gst_tag_list_to_exif_buffer (const GstTagList * taglist, GstBuffer * gst_tag_list_to_exif_buffer (const GstTagList * taglist,

View file

@ -24,9 +24,11 @@ EXPORTS
gst_tag_list_to_exif_buffer_with_tiff_header gst_tag_list_to_exif_buffer_with_tiff_header
gst_tag_list_to_vorbiscomment_buffer gst_tag_list_to_vorbiscomment_buffer
gst_tag_list_to_xmp_buffer gst_tag_list_to_xmp_buffer
gst_tag_list_to_xmp_buffer_full
gst_tag_parse_extended_comment gst_tag_parse_extended_comment
gst_tag_register_musicbrainz_tags gst_tag_register_musicbrainz_tags
gst_tag_to_id3_tag gst_tag_to_id3_tag
gst_tag_to_vorbis_comments gst_tag_to_vorbis_comments
gst_tag_to_vorbis_tag gst_tag_to_vorbis_tag
gst_tag_xmp_list_schemas
gst_vorbis_tag_add gst_vorbis_tag_add