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
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel