summaryrefslogtreecommitdiffstats
path: root/ext/metadata
diff options
context:
space:
mode:
authorStefan Kost <ensonic@users.sf.net>2009-06-22 18:35:21 +0300
committerStefan Kost <ensonic@users.sf.net>2009-06-22 18:35:21 +0300
commitd5b302ffc4b83a93c726f3b69cd1593adb232944 (patch)
tree3dfe780b629a9108793462ad069077ddb03ce245 /ext/metadata
parentb1367a95cae07d47360374cacbc5ac7b60675b42 (diff)
downloadgst-plugins-bad-d5b302ffc4b83a93c726f3b69cd1593adb232944.tar.gz
gst-plugins-bad-d5b302ffc4b83a93c726f3b69cd1593adb232944.tar.bz2
gst-plugins-bad-d5b302ffc4b83a93c726f3b69cd1593adb232944.zip
metadata: map more tags and fix reading of xmp tags
Register xmp schemas for photoshop and iptc. Map a few location tags there. Add more dc tags. Fix reading xmp tag by iteration over known schemas. Add some more debug logging.
Diffstat (limited to 'ext/metadata')
-rw-r--r--ext/metadata/metadatatags.c12
-rw-r--r--ext/metadata/metadatatags.h4
-rw-r--r--ext/metadata/metadataxmp.c64
3 files changed, 65 insertions, 15 deletions
diff --git a/ext/metadata/metadatatags.c b/ext/metadata/metadatatags.c
index 82e6c381..4beee172 100644
--- a/ext/metadata/metadatatags.c
+++ b/ext/metadata/metadatatags.c
@@ -446,5 +446,17 @@ metadata_tags_iptc_register (void)
static void
metadata_tags_xmp_register (void)
{
+ gst_tag_register (GST_TAG_XMP_GEO_LOCATION_COUNTRY, GST_TAG_FLAG_META,
+ G_TYPE_STRING, GST_TAG_XMP_GEO_LOCATION_COUNTRY,
+ "human readable english country name of where the media has been recorded or produced",
+ NULL);
+ gst_tag_register (GST_TAG_XMP_GEO_LOCATION_CITY, GST_TAG_FLAG_META,
+ G_TYPE_STRING, GST_TAG_XMP_GEO_LOCATION_CITY,
+ "human readable english city name of where the media has been recorded or produced",
+ NULL);
+ gst_tag_register (GST_TAG_XMP_GEO_LOCATION_SUBLOCATION, GST_TAG_FLAG_META,
+ G_TYPE_STRING, GST_TAG_XMP_GEO_LOCATION_SUBLOCATION,
+ "human readable location detail of where the media has been recorded or produced",
+ NULL);
}
diff --git a/ext/metadata/metadatatags.h b/ext/metadata/metadatatags.h
index 8500f15a..4d718738 100644
--- a/ext/metadata/metadatatags.h
+++ b/ext/metadata/metadatatags.h
@@ -126,6 +126,10 @@ typedef enum {
#define GST_TAG_GPS_SPEED ""
#define GST_TAG_GPS_TRACK ""
+#define GST_TAG_XMP_GEO_LOCATION_COUNTRY "geo-location-country"
+#define GST_TAG_XMP_GEO_LOCATION_CITY "geo-location-city"
+#define GST_TAG_XMP_GEO_LOCATION_SUBLOCATION "geo-location-sublocation"
+
/* *INDENT-ON* */
/*
diff --git a/ext/metadata/metadataxmp.c b/ext/metadata/metadataxmp.c
index 4da279df..5d5bdefa 100644
--- a/ext/metadata/metadataxmp.c
+++ b/ext/metadata/metadataxmp.c
@@ -155,13 +155,26 @@ typedef struct _tag_SchemaMap
#define XMP_SCHEMA_NODE 0x80000000UL
/* *INDENT-OFF* */
-/* When changing this table, update 'metadata_mapping.htm' file too. */
+/* When changing these tables, update 'metadata_mapping.htm' file too. */
static const SchemaTagMap schema_map_dublin_tags_map[] = {
+ {"creator", GST_TAG_ARTIST },
{"description", GST_TAG_DESCRIPTION },
- {"title", GST_TAG_TITLE },
+ {"format", GST_TAG_VIDEO_CODEC },
{"rights", GST_TAG_COPYRIGHT },
+ {"subject", GST_TAG_KEYWORDS },
+ {"title", GST_TAG_TITLE },
{"type", GST_TAG_CODEC },
- {"format", GST_TAG_VIDEO_CODEC },
+ {NULL, NULL}
+};
+
+static const SchemaTagMap schema_map_photoshop_tags_map[] = {
+ {"country", GST_TAG_XMP_GEO_LOCATION_COUNTRY },
+ {"city", GST_TAG_XMP_GEO_LOCATION_CITY },
+ {NULL, NULL}
+};
+
+static const SchemaTagMap schema_map_iptc4xmpcore_tags_map[] = {
+ {"location", GST_TAG_XMP_GEO_LOCATION_SUBLOCATION },
{NULL, NULL}
};
/* *INDENT-ON* */
@@ -173,9 +186,26 @@ static const SchemaMap schema_map_dublin = {
schema_map_dublin_tags_map
};
-/* When changing this table, update 'metadata_mapping.htm' file too. */
+/* http://www.adobe.com/devnet/xmp/pdfs/xmp_specification.pdf */
+static const SchemaMap schema_map_photoshop = {
+ "http://ns.adobe.com/photoshop/1.0/",
+ "photoshop:",
+ 10,
+ schema_map_photoshop_tags_map
+};
+
+/* http://www.iptc.org/std/Iptc4xmpCore/1.0/specification/Iptc4xmpCore_1.0-spec-XMPSchema_8.pdf */
+static const SchemaMap schema_map_iptc4xmpcore = {
+ "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/",
+ "Iptc4xmpCore:",
+ 13,
+ schema_map_iptc4xmpcore_tags_map
+};
+
static const SchemaMap *schemas_map[] = {
&schema_map_dublin,
+ &schema_map_photoshop,
+ &schema_map_iptc4xmpcore,
NULL
};
@@ -474,7 +504,6 @@ metadatamux_xmp_get_tagsmap_from_gsttag (const SchemaMap * schema_map,
if (NULL == schema_map)
goto done;
-
for (i = 0; schema_map->tags_map[i].gst_tag; i++) {
if (0 == strcmp (schema_map->tags_map[i].gst_tag, tag)) {
tags_map = (SchemaTagMap *) & schema_map->tags_map[i];
@@ -567,10 +596,14 @@ void
metadataparse_xmp_iter_node_schema (GstTagList * taglist, GstTagMergeMode mode,
XmpPtr xmp, const char *schema, const char *path)
{
- SchemaMap *schema_map = NULL;
+ const SchemaMap *schema_map = NULL;
+ gint i;
- if (0 == strcmp (schema, "http://purl.org/dc/elements/1.1/")) {
- schema_map = (SchemaMap *) & schema_map_dublin;
+ for (i = 0; schemas_map[i]; i++) {
+ if (0 == strcmp (schema, schemas_map[i]->schema)) {
+ schema_map = schemas_map[i];
+ break;
+ }
}
metadataparse_xmp_iter_array (taglist, mode, xmp, schema, path, schema_map);
@@ -805,6 +838,8 @@ metadatamux_xmp_for_each_tag_in_list (const GstTagList * list,
XmpPtr xmp = (XmpPtr) user_data;
int i;
+ GST_DEBUG ("trying to map tag '%s' to xmp", tag);
+
for (i = 0; schemas_map[i]; i++) {
/* FIXME: should try to get all of values (index) for the tag */
@@ -814,9 +849,7 @@ metadatamux_xmp_for_each_tag_in_list (const GstTagList * list,
metadatamux_xmp_get_tagsmap_from_gsttag (smap, tag);
if (stagmap) {
-
gchar *value = NULL;
-
GType type = gst_tag_get_type (tag);
switch (type) {
@@ -827,8 +860,10 @@ metadatamux_xmp_for_each_tag_in_list (const GstTagList * list,
break;
}
- if (value) {
+ GST_DEBUG ("found mapping for tag '%s' in schema %s", tag,
+ schemas_map[i]->prefix);
+ if (value) {
uint32_t options = 0;
#ifdef XMP_1_99_5
@@ -857,13 +892,12 @@ metadatamux_xmp_for_each_tag_in_list (const GstTagList * list,
}
g_free (value);
-
}
-
+ } else {
+ GST_DEBUG ("no xmp mapping for tag '%s' in schema %s found", tag,
+ schemas_map[i]->prefix);
}
-
}
-
}
#endif /* else (ifndef HAVE_XMP) */