mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-23 15:48:23 +00:00
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:
parent
f1f0625e97
commit
6cc96a67ec
3 changed files with 101 additions and 13 deletions
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue