avformat/mov: add ICC profile support for colr atom
authorvectronic <hello.vectronic@gmail.com>
Mon, 23 Sep 2019 20:43:04 +0000 (21:43 +0100)
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>
Tue, 10 Mar 2020 15:10:40 +0000 (15:10 +0000)
Signed-off-by: vectronic <hello.vectronic@gmail.com>
libavformat/mov.c

index ff1e534..79544da 100644 (file)
@@ -1546,6 +1546,7 @@ static int mov_read_enda(MOVContext *c, AVIOContext *pb, MOVAtom atom)
 static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
 {
     AVStream *st;
+    uint8_t *icc_profile;
     char color_parameter_type[5] = { 0 };
     uint16_t color_primaries, color_trc, color_matrix;
     int ret;
@@ -1558,12 +1559,22 @@ static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
     if (ret < 0)
         return ret;
     if (strncmp(color_parameter_type, "nclx", 4) &&
-        strncmp(color_parameter_type, "nclc", 4)) {
+        strncmp(color_parameter_type, "nclc", 4) &&
+        strncmp(color_parameter_type, "prof", 4)) {
         av_log(c->fc, AV_LOG_WARNING, "unsupported color_parameter_type %s\n",
                color_parameter_type);
         return 0;
     }
 
+    if (!strncmp(color_parameter_type, "prof", 4)) {
+        icc_profile = av_stream_new_side_data(st, AV_PKT_DATA_ICC_PROFILE, atom.size - 4);
+        if (!icc_profile)
+            return AVERROR(ENOMEM);
+        ret = ffio_read_size(pb, icc_profile, atom.size - 4);
+        if (ret < 0)
+            return ret;
+    }
+    else {
     color_primaries = avio_rb16(pb);
     color_trc = avio_rb16(pb);
     color_matrix = avio_rb16(pb);
@@ -1592,7 +1603,7 @@ static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
     st->codecpar->color_trc       = color_trc;
     st->codecpar->color_space     = color_matrix;
     av_log(c->fc, AV_LOG_TRACE, "\n");
-
+    }
     return 0;
 }