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".