From 01f068ffadc6fcc3de58635cf73383be8e7e9ca6 Mon Sep 17 00:00:00 2001
From: Colin McFadden <cmcfadden@gmail.com>
Date: Wed, 20 Apr 2016 22:08:38 -0500
Subject: [PATCH] Add support for spherical metadata from uuid atom, stored in
 stream metadata.

---
 libavformat/mov.c | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index 47af98c..d2403a6 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -3904,6 +3904,7 @@ static int mov_read_uuid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
 {
     int ret;
     uint8_t uuid[16];
+    
     static const uint8_t uuid_isml_manifest[] = {
         0xa5, 0xd4, 0x0b, 0x30, 0xe8, 0x14, 0x11, 0xdd,
         0xba, 0x2f, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66
@@ -3912,6 +3913,11 @@ static int mov_read_uuid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
         0xbe, 0x7a, 0xcf, 0xcb, 0x97, 0xa9, 0x42, 0xe8,
         0x9c, 0x71, 0x99, 0x94, 0x91, 0xe3, 0xaf, 0xac
     };
+     static const uint8_t uuid_spherical[] = {
+        0xFF, 0xCC, 0x82, 0x63, 0xF8, 0x55, 0x4A, 0x93,
+        0x88, 0x14, 0x58, 0x7A, 0x02, 0x52, 0x1F, 0xDD
+    };
+
 
     if (atom.size < sizeof(uuid) || atom.size == INT64_MAX)
         return AVERROR_INVALIDDATA;
@@ -3987,6 +3993,33 @@ static int mov_read_uuid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
             av_dict_set(&c->fc->metadata, "xmp", buffer, 0);
         }
         av_free(buffer);
+    } else if (!memcmp(uuid, uuid_spherical, sizeof(uuid))) {
+        uint8_t *buffer;
+        AVStream *st;
+        size_t len = atom.size - sizeof(uuid);
+        
+        if (c->fc->nb_streams < 1) // spherical uuid is only valid in a stream
+            return 0;
+
+        st = c->fc->streams[c->fc->nb_streams-1];
+
+        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;
+        }
+
+        buffer[len] = '\0';
+        av_dict_set(&st->metadata, "spherical-video", buffer, 0);
+
+        av_free(buffer);
     }
     return 0;
 }
-- 
2.6.3

