changeset 9:bfd933ef38b4

Implement some metadata support in TIFF and clean up meta data handling otherwise.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 07 Dec 2016 15:22:56 +0200
parents 5a1eec3c43cc
children d04d9e3a77d0
files bpgenc.c
diffstat 1 files changed, 49 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/bpgenc.c	Wed Dec 07 14:04:58 2016 +0200
+++ b/bpgenc.c	Wed Dec 07 15:22:56 2016 +0200
@@ -909,6 +909,43 @@
     }
 }
 
+void insert_md(BPGMetaData **list, BPGMetaData *node)
+{
+    if (*list == NULL)
+    {
+        *list = node;
+        node->next = NULL;
+    }
+    else
+    {
+        node->next = *list;
+        *list = node;
+    }
+}
+
+int add_md_contents(BPGMetaData **list, const int tag, const size_t len, const void *buf)
+{
+    BPGMetaData *md;
+
+    if ((md = bpg_md_alloc(tag)) == NULL)
+        goto err;
+
+    if ((md->buf = malloc(len)) == NULL)
+        goto err;
+
+    md->buf_len = len;
+    memcpy(md->buf, buf, len);
+    insert_md(list, md);
+    return 0;
+
+err:
+    bpg_md_free(md);
+    return -1;
+}
+
+
+#define TIFF_DEBUG
+
 Image *read_tiff(BPGMetaData **pmd, const char *filename,
     BPGColorSpaceEnum color_space, int out_bit_depth,
     int limited_range, int premultiplied_alpha)
@@ -916,16 +953,14 @@
     TIFF *tif;
     Image *img = NULL;
     BPGImageFormatEnum img_format;
-    uint8_t *buf = NULL;
-    uint32_t img_width, img_height;
+    uint8_t *buf = NULL, *tmp_buf = NULL;
+    uint32_t img_width, img_height, tmp_len;
     int img_alpha, img_bpp;
     size_t img_linesize;
-    uint16_t img_depth, img_spp, img_sfmt, img_pconfig;
+    uint16_t img_depth, img_spp, img_pconfig;
     ColorConvertState cvt;
     RGBConvertFunc *convert_func;
 
-    *pmd = NULL;
-
     // Open and read TIFF header etc.
     if ((tif = TIFFOpen(filename, "rb")) == NULL)
     {
@@ -1010,6 +1045,12 @@
         }
     }
 
+    // Get meta data
+    if (TIFFGetField(tif, TIFFTAG_ICCPROFILE, &tmp_len, &tmp_buf))
+        add_md_contents(pmd, BPG_EXTENSION_TAG_ICCP, tmp_len, tmp_buf);
+
+    if (TIFFGetField(tif, TIFFTAG_XMLPACKET, &tmp_len, &tmp_buf))
+        add_md_contents(pmd, BPG_EXTENSION_TAG_XMP, tmp_len, tmp_buf);
 
 err:
     if (buf != NULL)
@@ -1031,7 +1072,6 @@
     int y, has_alpha, linesize, bpp;
     BPGImageFormatEnum format;
     ColorConvertState cvt_s, *cvt = &cvt_s;
-    BPGMetaData *md, **plast_md, *first_md;
 
     png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
                                      NULL, NULL, NULL);
@@ -1171,8 +1211,6 @@
     png_read_end(png_ptr, info_ptr);
 
     /* get the ICC profile if present */
-    first_md = NULL;
-    plast_md = &first_md;
     {
         png_charp name;
         int comp_type;
@@ -1180,20 +1218,12 @@
         png_uint_32 iccp_buf_len;
 
         if (png_get_iCCP(png_ptr, info_ptr,
-                         &name, &comp_type, &iccp_buf, &iccp_buf_len) ==
-            PNG_INFO_iCCP) {
-            md = bpg_md_alloc(BPG_EXTENSION_TAG_ICCP);
-            md->buf_len = iccp_buf_len;
-            md->buf = malloc(iccp_buf_len);
-            memcpy(md->buf, iccp_buf, iccp_buf_len);
-            *plast_md = md;
-            plast_md = &md->next;
-        }
+                         &name, &comp_type, &iccp_buf, &iccp_buf_len) == PNG_INFO_iCCP)
+            add_md_contents(pmd, BPG_EXTENSION_TAG_ICCP, iccp_buf_len, iccp_buf);
     }
 
     png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
 
-    *pmd = first_md;
     return img;
 }
 
@@ -1303,7 +1333,6 @@
     BPGImageFormatEnum format;
     BPGColorSpaceEnum color_space;
     ColorConvertState cvt_s, *cvt = &cvt_s;
-    BPGMetaData *first_md = NULL;
     uint32_t comp_hv;
 
     cinfo.err = jpeg_std_error(&jerr);
@@ -1521,13 +1550,12 @@
         free(buf);
     }
 
-    first_md = jpeg_get_metadata(cinfo.marker_list);
+    *pmd = jpeg_get_metadata(cinfo.marker_list);
 
  the_end:
     jpeg_finish_decompress(&cinfo);
 
     jpeg_destroy_decompress(&cinfo);
-    *pmd = first_md;
     return img;
 }