summaryrefslogtreecommitdiffstats
path: root/ext/metadata/metadataiptc.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/metadata/metadataiptc.c')
-rw-r--r--ext/metadata/metadataiptc.c150
1 files changed, 143 insertions, 7 deletions
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 <iptc-data.h>
+#include <iptc-tag.h>
#include <string.h>
+#include <gst/gsttaglist.h>
+
+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;
}