Also add additional known values and log as missing features.
---
 libavcodec/tiff.c    |   43 ++++++++++++++++++++++++++-----------------
 libavcodec/tiff.h    |   18 +++++++++++++++++-
 libavcodec/tiffenc.c |   20 ++++++++++----------
 3 files changed, 53 insertions(+), 28 deletions(-)

diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
index 42c4c15..385ee8e 100644
--- a/libavcodec/tiff.c
+++ b/libavcodec/tiff.c
@@ -51,7 +51,7 @@ typedef struct TiffContext {
     int palette_is_set;
     int le;
     enum TiffCompr compr;
-    int invert;
+    enum TiffPhotometric photometric;
     int fax_opts;
     int predictor;
     int fill_order;
@@ -447,20 +447,29 @@ static int tiff_decode_tag(TiffContext *s)
     case TIFF_PREDICTOR:
         s->predictor = value;
         break;
-    case TIFF_INVERT:
+    case TIFF_PHOTOMETRIC:
         switch (value) {
-        case 0:
-            s->invert = 1;
-            break;
-        case 1:
-            s->invert = 0;
-            break;
-        case 2:
-        case 3:
+        case TIFF_PHOTOMETRIC_WHITEISZERO:
+        case TIFF_PHOTOMETRIC_BLACKISZERO:
+        case TIFF_PHOTOMETRIC_RGB:
+        case TIFF_PHOTOMETRIC_PALETTE:
+            s->photometric = value;
             break;
+        case TIFF_PHOTOMETRIC_ALPHA_MASK:
+        case TIFF_PHOTOMETRIC_SEPARATED:
+        case TIFF_PHOTOMETRIC_YCBCR:
+        case TIFF_PHOTOMETRIC_CIELAB:
+        case TIFF_PHOTOMETRIC_ICCLAB:
+        case TIFF_PHOTOMETRIC_ITULAB:
+        case TIFF_PHOTOMETRIC_LOGL:
+        case TIFF_PHOTOMETRIC_LOGLUV:
+            avpriv_report_missing_feature(s->avctx,
+                                          "Unimplemented 
PhotometricInterpretation: "
+                                          "0x%04X", value);
+            return AVERROR_PATCHWELCOME;
         default:
-            av_log(s->avctx, AV_LOG_ERROR, "Color mode %d is not supported\n",
-                   value);
+            av_log(s->avctx, AV_LOG_ERROR, "PhotometricInterpretation %d is "
+                   "not supported\n", value);
             return AVERROR_INVALIDDATA;
         }
         break;
@@ -546,10 +555,10 @@ static int decode_frame(AVCodecContext *avctx,
         av_log(avctx, AV_LOG_ERROR, "TIFF header not found\n");
         return AVERROR_INVALIDDATA;
     }
-    s->le         = le;
-    s->invert     = 0;
-    s->compr      = TIFF_RAW;
-    s->fill_order = 0;
+    s->le          = le;
+    s->photometric = TIFF_PHOTOMETRIC_NONE;
+    s->compr       = TIFF_RAW;
+    s->fill_order  = 0;
     // As TIFF 6.0 specification puts it "An arbitrary but carefully chosen 
number
     // that further identifies the file as a TIFF file"
     if (tget_short(&s->gb, le) != 42) {
@@ -633,7 +642,7 @@ static int decode_frame(AVCodecContext *avctx,
         }
     }
 
-    if (s->invert) {
+    if (s->photometric == TIFF_PHOTOMETRIC_WHITEISZERO) {
         dst = p->data[0];
         for (i = 0; i < s->height; i++) {
             for (j = 0; j < p->linesize[0]; j++)
diff --git a/libavcodec/tiff.h b/libavcodec/tiff.h
index 9052d2f..7a7de9a 100644
--- a/libavcodec/tiff.h
+++ b/libavcodec/tiff.h
@@ -37,7 +37,7 @@ enum TiffTags {
     TIFF_HEIGHT,
     TIFF_BPP,
     TIFF_COMPR,
-    TIFF_INVERT             = 0x106,
+    TIFF_PHOTOMETRIC        = 0x106,
     TIFF_FILL_ORDER         = 0x10A,
     TIFF_STRIP_OFFS         = 0x111,
     TIFF_SAMPLES_PER_PIXEL  = 0x115,
@@ -82,6 +82,22 @@ enum TiffTypes {
     TIFF_RATIONAL,
 };
 
+enum TiffPhotometric {
+    TIFF_PHOTOMETRIC_NONE = -1,
+    TIFF_PHOTOMETRIC_WHITEISZERO,     /* mono or grayscale, 0 is white */
+    TIFF_PHOTOMETRIC_BLACKISZERO,     /* mono or grayscale, 0 is black */
+    TIFF_PHOTOMETRIC_RGB,             /* RGB or RGBA*/
+    TIFF_PHOTOMETRIC_PALETTE,         /* Uses a palette */
+    TIFF_PHOTOMETRIC_ALPHA_MASK,      /* Transparency mask */
+    TIFF_PHOTOMETRIC_SEPARATED,       /* CMYK or some other ink set */
+    TIFF_PHOTOMETRIC_YCBCR,           /* YCbCr */
+    TIFF_PHOTOMETRIC_CIELAB = 8,      /* 1976 CIE L*a*b* */
+    TIFF_PHOTOMETRIC_ICCLAB,          /* ICC L*a*b* */
+    TIFF_PHOTOMETRIC_ITULAB,          /* ITU L*a*b* */
+    TIFF_PHOTOMETRIC_LOGL = 32844,    /* CIE Log2(L) */
+    TIFF_PHOTOMETRIC_LOGLUV
+};
+
 /** sizes of various TIFF field types (string size = 100)*/
 static const uint8_t type_sizes[6] = {
     0, 1, 100, 2, 4, 8
diff --git a/libavcodec/tiffenc.c b/libavcodec/tiffenc.c
index 528673b..bf73f7f 100644
--- a/libavcodec/tiffenc.c
+++ b/libavcodec/tiffenc.c
@@ -57,7 +57,7 @@ typedef struct TiffEncoderContext {
     unsigned int bpp;                       ///< bits per pixel
     int compr;                              ///< compression level
     int bpp_tab_size;                       ///< bpp_tab size
-    int photometric_interpretation;         ///< photometric interpretation
+    enum TiffPhotometric photometric_interpretation;  ///< photometric 
interpretation
     int strips;                             ///< number of strips
     int rps;                                ///< row per strip
     uint8_t entries[TIFF_MAX_ENTRY * 12];   ///< entries in header
@@ -242,23 +242,23 @@ static int encode_frame(AVCodecContext *avctx, AVPacket 
*pkt,
         pfd    = av_pix_fmt_desc_get(avctx->pix_fmt);
         s->bpp = av_get_bits_per_pixel(pfd);
         if (pfd->flags & AV_PIX_FMT_FLAG_PAL)
-            s->photometric_interpretation = 3;
+            s->photometric_interpretation = TIFF_PHOTOMETRIC_PALETTE;
         else if (pfd->flags & AV_PIX_FMT_FLAG_RGB)
-            s->photometric_interpretation = 2;
+            s->photometric_interpretation = TIFF_PHOTOMETRIC_RGB;
         else
-            s->photometric_interpretation = 1;
+            s->photometric_interpretation = TIFF_PHOTOMETRIC_BLACKISZERO;
         s->bpp_tab_size = pfd->nb_components;
         for (i = 0; i < s->bpp_tab_size; i++)
             bpp_tab[i] = s->bpp / s->bpp_tab_size;
         break;
     case AV_PIX_FMT_MONOBLACK:
         s->bpp                        = 1;
-        s->photometric_interpretation = 1;
+        s->photometric_interpretation = TIFF_PHOTOMETRIC_BLACKISZERO;
         s->bpp_tab_size               = 0;
         break;
     case AV_PIX_FMT_MONOWHITE:
         s->bpp                        = 1;
-        s->photometric_interpretation = 0;
+        s->photometric_interpretation = TIFF_PHOTOMETRIC_WHITEISZERO;
         s->bpp_tab_size               = 0;
         break;
     case AV_PIX_FMT_YUV420P:
@@ -267,7 +267,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket 
*pkt,
     case AV_PIX_FMT_YUV410P:
     case AV_PIX_FMT_YUV411P:
         av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &shift_h, &shift_v);
-        s->photometric_interpretation = 6;
+        s->photometric_interpretation = TIFF_PHOTOMETRIC_YCBCR;
         s->bpp                        = 8 + (16 >> (shift_h + shift_v));
         s->subsampling[0]             = 1 << shift_h;
         s->subsampling[1]             = 1 << shift_v;
@@ -415,9 +415,9 @@ static int encode_frame(AVCodecContext *avctx, AVPacket 
*pkt,
     if (s->bpp_tab_size)
         add_entry(s, TIFF_BPP, TIFF_SHORT, s->bpp_tab_size, bpp_tab);
 
-    add_entry1(s, TIFF_COMPR,      TIFF_SHORT, s->compr);
-    add_entry1(s, TIFF_INVERT,     TIFF_SHORT, s->photometric_interpretation);
-    add_entry(s,  TIFF_STRIP_OFFS, TIFF_LONG,  strips, strip_offsets);
+    add_entry1(s, TIFF_COMPR,       TIFF_SHORT, s->compr);
+    add_entry1(s, TIFF_PHOTOMETRIC, TIFF_SHORT, s->photometric_interpretation);
+    add_entry(s,  TIFF_STRIP_OFFS,  TIFF_LONG,  strips, strip_offsets);
 
     if (s->bpp_tab_size)
         add_entry1(s, TIFF_SAMPLES_PER_PIXEL, TIFF_SHORT, s->bpp_tab_size);
-- 
1.7.1

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to