aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat
diff options
context:
space:
mode:
authorThierry Foucu <tfoucu@gmail.com>2016-02-05 15:39:25 -0800
committerMichael Niedermayer <michael@niedermayer.cc>2016-02-09 01:31:15 +0100
commit020b75806f6e113630846a5bccece8cefb23626a (patch)
tree7b19442016d26019a8fbc909ad58fd50fd0b6719 /libavformat
parentcb8646af24bd8e9627cc5e1c62b049a00fe0b07b (diff)
downloadffmpeg-020b75806f6e113630846a5bccece8cefb23626a.tar.gz
lavf/mov: Extend extracting XMP in mov files using UUID Box
The UUID is based on http://www.adobe.com/devnet/xmp.html The patch is made according to XMP SPECIFICATION PART 3 - STORAGE IN FILES See Table 8 Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/mov.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 944bd86443..299bee6f29 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -3895,6 +3895,10 @@ static int mov_read_uuid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
0xa5, 0xd4, 0x0b, 0x30, 0xe8, 0x14, 0x11, 0xdd,
0xba, 0x2f, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66
};
+ static const uint8_t uuid_xmp[] = {
+ 0xbe, 0x7a, 0xcf, 0xcb, 0x97, 0xa9, 0x42, 0xe8,
+ 0x9c, 0x71, 0x99, 0x94, 0x91, 0xe3, 0xaf, 0xac
+ };
if (atom.size < sizeof(uuid) || atom.size == INT64_MAX)
return AVERROR_INVALIDDATA;
@@ -3949,6 +3953,27 @@ static int mov_read_uuid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
}
av_free(buffer);
+ } else if (!memcmp(uuid, uuid_xmp, sizeof(uuid))) {
+ uint8_t *buffer;
+ size_t len = atom.size - sizeof(uuid);
+
+ buffer = av_mallocz(len + 1);
+ if (!buffer) {
+ return AVERROR(ENOMEM);
+ }
+ ret = avio_read(pb, buffer, len);
+ if (ret < 0) {
+ av_free(buffer);
+ return ret;
+ } else if (ret != len) {
+ av_free(buffer);
+ return AVERROR_INVALIDDATA;
+ }
+ if (c->export_xmp) {
+ buffer[len] = '\0';
+ av_dict_set(&c->fc->metadata, "xmp", buffer, 0);
+ }
+ av_free(buffer);
}
return 0;
}