From 1575ffdb270cb110944e432c5ed16e6ae0260b74 Mon Sep 17 00:00:00 2001
From: Marek Fort <marek.fort@chyronhego.com>
Date: Wed, 6 Aug 2014 16:48:21 +0200
Subject: [PATCH] Reading/writing XMP metadata in mov container.

---
 libavformat/mov.c    |  2 ++
 libavformat/movenc.c | 21 +++++++++++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index ab85918..57977f3 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -318,6 +318,8 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext *pb, MOVAtom atom)
         return mov_metadata_raw(c, pb, atom.size, "quicktime_version");
     case MKTAG( 'l','o','c','i'):
         return mov_metadata_loci(c, pb, atom.size);
+    case MKTAG( 'X','M','P','_'):
+        return mov_metadata_raw(c, pb, atom.size, "xmp");
     }
 
     if (c->itunes_metadata && atom.size > 8) {
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 20006ef..86dbe7f 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -2395,6 +2395,26 @@ static int mov_write_meta_tag(AVIOContext *pb, MOVMuxContext *mov,
     return size;
 }
 
+static int mov_write_raw_metadata_tag(AVFormatContext *s, AVIOContext *pb,
+                                      const char *name, const char *key)
+{
+    int len;
+    AVDictionaryEntry *t;
+
+    if (!(t = av_dict_get(s->metadata, key, NULL, 0)))
+        return 0;
+
+    len = strlen(t->value);
+    if (len > 0) {
+        int size = len + 8;
+        avio_wb32(pb, size);
+        ffio_wfourcc(pb, name);
+        avio_write(pb, t->value, len);
+        return size;
+    }
+    return 0;
+}
+
 static int ascii_to_wc(AVIOContext *pb, const uint8_t *b)
 {
     int val;
@@ -2494,6 +2514,7 @@ static int mov_write_udta_tag(AVIOContext *pb, MOVMuxContext *mov,
         mov_write_string_metadata(s, pb_buf, "\251cmt", "comment",     0);
         mov_write_string_metadata(s, pb_buf, "\251gen", "genre",       0);
         mov_write_string_metadata(s, pb_buf, "\251cpy", "copyright",   0);
+        mov_write_raw_metadata_tag(s, pb_buf, "XMP_", "xmp");
     } else {
         /* iTunes meta data */
         mov_write_meta_tag(pb_buf, mov, s);
-- 
1.9.0.msysgit.0

