From 21962cbffe8d7255726b34bfc3a773ffcc3fa43b Mon Sep 17 00:00:00 2001 From: Edgard Lima Date: Fri, 21 Dec 2007 19:01:00 +0000 Subject: Some IPTC tags mapped. Original commit message from CVS: Some IPTC tags mapped. --- ext/metadata/metadataiptc.c | 150 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 143 insertions(+), 7 deletions(-) (limited to 'ext/metadata/metadataiptc.c') diff --git a/ext/metadata/metadataiptc.c b/ext/metadata/metadataiptc.c index b052d329..0b040ede 100644 --- a/ext/metadata/metadataiptc.c +++ b/ext/metadata/metadataiptc.c @@ -75,11 +75,74 @@ metadatamux_iptc_create_chunk_from_tag_list (guint8 ** buf, guint32 * size, #else /* ifndef HAVE_IPTC */ #include +#include #include +#include + +typedef struct _tag_MEUserData +{ + GstTagList *taglist; + GstTagMergeMode mode; +} MEUserData; + +typedef struct _tag_MapIntStr +{ + IptcRecord record; + IptcTag iptc; + const gchar *str; +} MapIntStr; static void iptc_data_foreach_dataset_func (IptcDataSet * dataset, void *user_data); +/* *INDENT-OFF* */ +static MapIntStr mappedTags[] = { + {IPTC_RECORD_APP_2, IPTC_TAG_OBJECT_NAME, /*ASCII*/ GST_TAG_TITLE /*STRING*/}, + {IPTC_RECORD_APP_2, IPTC_TAG_BYLINE, /*ASCII*/ GST_TAG_COMPOSER /*STRING*/}, + {IPTC_RECORD_APP_2, IPTC_TAG_CAPTION, /*ASCII*/ GST_TAG_DESCRIPTION /*STRING*/}, + {IPTC_RECORD_APP_2, IPTC_TAG_COPYRIGHT_NOTICE, /*ASCII*/ GST_TAG_COPYRIGHT /*STRING*/}, + {0, 0, NULL} +}; +/* *INDENT-ON* */ + +static const gchar * +metadataparse_iptc_get_tag_from_iptc (IptcTag iptc, GType * type, + IptcRecord * record) +{ + int i = 0; + + while (mappedTags[i].iptc) { + if (iptc == mappedTags[i].iptc) { + *type = gst_tag_get_type (mappedTags[i].str); + *record = mappedTags[i].record; + break; + } + ++i; + } + + return mappedTags[i].str; + +} + +static IptcTag +metadataparse_iptc_get_iptc_from_tag (const gchar * tag, GType * type, + IptcRecord * record) +{ + int i = 0; + + while (mappedTags[i].iptc) { + if (0 == strcmp (mappedTags[i].str, tag)) { + *type = gst_tag_get_type (tag); + *record = mappedTags[i].record; + break; + } + ++i; + } + + return mappedTags[i].iptc; + +} + void metadataparse_iptc_tag_list_add (GstTagList * taglist, GstTagMergeMode mode, GstAdapter * adapter, MetadataTagMapping mapping) @@ -87,6 +150,7 @@ metadataparse_iptc_tag_list_add (GstTagList * taglist, GstTagMergeMode mode, const guint8 *buf; guint32 size; IptcData *iptc = NULL; + MEUserData user_data = { taglist, mode }; if (adapter == NULL || (size = gst_adapter_available (adapter)) == 0) { goto done; @@ -108,7 +172,7 @@ metadataparse_iptc_tag_list_add (GstTagList * taglist, GstTagMergeMode mode, } iptc_data_foreach_dataset (iptc, iptc_data_foreach_dataset_func, - (void *) taglist); + (void *) &user_data); done: @@ -123,20 +187,81 @@ static void iptc_data_foreach_dataset_func (IptcDataSet * dataset, void *user_data) { - char buf[256]; - GstTagList *taglist = (GstTagList *) user_data; + char buf[1024]; + MEUserData *meudata = (MEUserData *) user_data; + GType type; + IptcRecord record; + const gchar *tag = + metadataparse_iptc_get_tag_from_iptc (dataset->tag, &type, &record); + const gchar *value = iptc_dataset_get_as_str (dataset, buf, 1024); + + if (!tag) + goto done; + + gst_tag_list_add (meudata->taglist, meudata->mode, tag, value, NULL); + +done: GST_LOG ("name -> %s", iptc_tag_get_name (dataset->record, dataset->tag)); GST_LOG ("title -> %s", iptc_tag_get_title (dataset->record, dataset->tag)); GST_LOG ("description -> %s", iptc_tag_get_description (dataset->record, dataset->tag)); - GST_LOG ("value = %s", iptc_dataset_get_as_str (dataset, buf, 256)); + GST_LOG ("value = %s", value); + GST_LOG ("record = %d", dataset->record); + + return; + +} + + +static void +metadataiptc_for_each_tag_in_list (const GstTagList * list, const gchar * tag, + gpointer user_data) +{ + IptcData *iptc = (IptcData *) user_data; + IptcTag iptc_tag; + IptcRecord record; + GType type; + IptcDataSet *dataset = NULL; + gboolean new_dataset = FALSE; + gchar *tag_value = NULL; + + iptc_tag = metadataparse_iptc_get_iptc_from_tag (tag, &type, &record); + + if (!iptc_tag) + goto done; + + dataset = iptc_data_get_dataset (iptc, record, iptc_tag); + + if (!dataset) { + dataset = iptc_dataset_new (); + new_dataset = TRUE; + } + + iptc_dataset_set_tag (dataset, record, iptc_tag); + + if (gst_tag_list_get_string (list, tag, &tag_value)) { + iptc_dataset_set_data (dataset, tag_value, strlen (tag_value), + IPTC_DONT_VALIDATE); + g_free (tag_value); + tag_value = NULL; + } + + + if (new_dataset) + iptc_data_add_dataset (iptc, dataset); + +done: + + if (dataset) + iptc_dataset_unref (dataset); } void metadatamux_iptc_create_chunk_from_tag_list (guint8 ** buf, guint32 * size, const GstTagList * taglist) { + IptcData *iptc = NULL; GstBuffer *iptc_chunk = NULL; const GValue *val = NULL; @@ -152,14 +277,25 @@ metadatamux_iptc_create_chunk_from_tag_list (guint8 ** buf, guint32 * size, if (val) { iptc_chunk = gst_value_get_buffer (val); if (iptc_chunk) { - *size = GST_BUFFER_SIZE (iptc_chunk); - *buf = g_new (guint8, *size); - memcpy (*buf, GST_BUFFER_DATA (iptc_chunk), *size); + iptc = iptc_data_new_from_data (GST_BUFFER_DATA (iptc_chunk), + GST_BUFFER_SIZE (iptc_chunk)); } } + if (!iptc) { + iptc = iptc_data_new (); + } + + gst_tag_list_foreach (taglist, metadataiptc_for_each_tag_in_list, iptc); + + iptc_data_save (iptc, buf, size); + + done: + if (iptc) + iptc_data_unref (iptc); + return; } -- cgit v1.2.1