Jan 13, 2020, 16:06 by derek.buitenh...@gmail.com:

> On 10/01/2020 22:06, Lynne wrote:
>
>> Patch attached.
>>
>> Very widespread, every NASA TIFF image has an ICC profile embedded, and its 
>> almost never sRGB, so this is really needed for proper color display.
>>
>
> [...]
>
>> ---
>>  libavcodec/tiff.c | 13 +++++++++++++
>>  libavcodec/tiff.h |  1 +
>>  2 files changed, 14 insertions(+)
>>
>> +    case TIFF_ICC_PROFILE:
>> +        if (count >= INT_MAX || count <= 0)
>> +            return AVERROR_INVALIDDATA;
>>
>
> Should this be > instead of >=?
>

Actually the entire condition needs to be gone. count is uint32_t. The length 
is already checked below.
Copied this from ff_tadd_shorts_metadata which has an int count.
And the offset value isn't taken into account. TIFF allows the ICC profile to 
be placed pretty much anywhere within the file (the 32 bit offset points from 
the start of the file, not the field). So this would only work with files where 
the ICC profile immediately follows the tag.

Attached a new patch.
>From b1c9e7a6a72b35707ba234df046b7c55f02bb12f Mon Sep 17 00:00:00 2001
From: Lynne <d...@lynne.ee>
Date: Fri, 10 Jan 2020 21:55:19 +0000
Subject: [PATCH] tiffdec: support embedded ICC profiles

---
 libavcodec/tiff.c | 18 ++++++++++++++++++
 libavcodec/tiff.h |  1 +
 2 files changed, 19 insertions(+)

diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
index 636614aa28..e8357114de 100644
--- a/libavcodec/tiff.c
+++ b/libavcodec/tiff.c
@@ -1218,6 +1218,8 @@ static void set_sar(TiffContext *s, unsigned tag, unsigned num, unsigned den)
 
 static int tiff_decode_tag(TiffContext *s, AVFrame *frame)
 {
+    AVFrameSideData *sd;
+    GetByteContext gb_temp;
     unsigned tag, type, count, off, value = 0, value2 = 1; // value2 is a denominator so init. to 1
     int i, start;
     int pos;
@@ -1643,6 +1645,22 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame)
             }
         }
         break;
+    case TIFF_ICC_PROFILE:
+        if (type != TIFF_UNDEFINED)
+            return AVERROR_INVALIDDATA;
+
+        gb_temp = s->gb;
+        bytestream2_seek(&gb_temp, SEEK_SET, off);
+
+        if (bytestream2_get_bytes_left(&gb_temp) < count)
+            return AVERROR_INVALIDDATA;
+
+        sd = av_frame_new_side_data(frame, AV_FRAME_DATA_ICC_PROFILE, count);
+        if (!sd)
+            return AVERROR(ENOMEM);
+
+        bytestream2_get_bufferu(&gb_temp, sd->data, count);
+        break;
     case TIFF_ARTIST:
         ADD_METADATA(count, "artist", NULL);
         break;
diff --git a/libavcodec/tiff.h b/libavcodec/tiff.h
index 2184c2c829..c07a5d4fa9 100644
--- a/libavcodec/tiff.h
+++ b/libavcodec/tiff.h
@@ -92,6 +92,7 @@ enum TiffTags {
     TIFF_MODEL_TIEPOINT     = 0x8482,
     TIFF_MODEL_PIXEL_SCALE  = 0x830E,
     TIFF_MODEL_TRANSFORMATION= 0x8480,
+    TIFF_ICC_PROFILE        = 0x8773,
     TIFF_GEO_KEY_DIRECTORY  = 0x87AF,
     TIFF_GEO_DOUBLE_PARAMS  = 0x87B0,
     TIFF_GEO_ASCII_PARAMS   = 0x87B1,
-- 
2.25.0.rc2

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to